嵌入式:走馬燈-stm32GPIOF_LED9、10; GPIOE_D10、D12 流水綫蜂鸣器

stm32GPIOF_LED9、10; GPIOE_D10、D12

cpp 复制代码
#include <stm32f4xx.h>

void delay(uint32_t ms)
{
	int i,j;
	for(i=0;i<ms;i++){
		for(j=0;j<2500;j++);
	}
}

int main()
{
	//GPIOF9、10
	// 指向RCC_AHB1ENR寄存器
    volatile uint32_t *RCC_AHB1ENR=(uint32_t *)(0x40023800+0x30);    
    
	
    // 指向GPIOF_MODER寄存器
    volatile uint32_t *GPIOF_MODER = (uint32_t *)(0x40021400 + 0x00);

    // 指向GPIOF_OTYPER寄存器    
    volatile uint32_t *GPIOF_OTYPER = (uint32_t *)(0x40021400 + 0x04);

    // 指向GPIOF_OSPEEDR寄存器    
    volatile uint32_t *GPIOF_OSPEEDR = (uint32_t *)(0x40021400 + 0x08);

    // 指向GPIOF_PUPDR寄存器
    volatile uint32_t *GPIOF_PUPDR = (uint32_t *)(0x40021400 + 0x0C);

    // 指向GPIOF_ODR寄存器
    volatile uint32_t *GPIOF_ODR = (uint32_t *)(0x40021400 + 0x14);
		
	//GPIOE_D10、D11
    // 指向GPIOE_MODER寄存器
    volatile uint32_t *GPIOE_MODER = (uint32_t *)(0x40021000 + 0x00);

    // 指向GPIOE_OTYPER寄存器    
    volatile uint32_t *GPIOE_OTYPER = (uint32_t *)(0x40021000 + 0x04);

    // 指向GPIOE_OSPEEDR寄存器    
    volatile uint32_t *GPIOE_OSPEEDR = (uint32_t *)(0x40021000 + 0x08);

    // 指向GPIOE_PUPDR寄存器
    volatile uint32_t *GPIOE_PUPDR = (uint32_t *)(0x40021000 + 0x0C);

    // 指向GPIOE_ODR寄存器
    volatile uint32_t *GPIOE_ODR = (uint32_t *)(0x40021000 + 0x14);
	
	//使能GPIOF时钟
	*RCC_AHB1ENR |= 1<<5;
	
	// 设置GPIOF9为输出模式
	*GPIOF_MODER &= ~(0x03 << (9 * 2));
    *GPIOF_MODER |= (0x01 << (9 * 2));
    
    // 设置GPIOF9为推挽输出
    *GPIOF_OTYPER &= ~(0x01 << 9);

    // 设置GPIOF9的速度为高速
    *GPIOF_OSPEEDR |= (0x03 << (9 * 2));    
    
    // 设置GPIOF9为无上拉/下拉    
    *GPIOF_PUPDR &= ~(0x03 << (9 * 2));   

	// 设置GPIOF10为输出模式
	*GPIOF_MODER &= ~(0x03 << (10 * 2));
    *GPIOF_MODER |= (0x01 << (10 * 2));
    
    // 设置GPIOF10为推挽输出
    *GPIOF_OTYPER &= ~(0x01 << 10);

    // 设置GPIOF10的速度为高速
    *GPIOF_OSPEEDR |= (0x03 << (10 * 2));    
    
    // 设置GPIOF10为无上拉/下拉    
    *GPIOF_PUPDR &= ~(0x03 << (10 * 2));   
	
	
	//使能GPIOE时钟
	*RCC_AHB1ENR |= 1<<4;
	
	// 设置GPIOED_10为输出模式
	*GPIOE_MODER &= ~(0x03 << (13 * 2));
    *GPIOE_MODER |= (0x01 << (13 * 2));
    
    // 设置GPIOF10为推挽输出
    *GPIOE_OTYPER &= ~(0x01 << 13);

    // 设置GPIOF10的速度为高速
    *GPIOE_OSPEEDR |= (0x03 << (13 * 2));    
    
    // 设置GPIOF10为无上拉/下拉    
    *GPIOE_PUPDR &= ~(0x03 << (13 * 2)); 
	// 设置GPIOED_11为输出模式
	*GPIOE_MODER &= ~(0x03 << (14 * 2));
    *GPIOE_MODER |= (0x01 << (14 * 2));
    
    // 设置GPIOED_11为推挽输出
    *GPIOE_OTYPER &= ~(0x01 << 14);

    // 设置GPIOED_11的速度为高速
    *GPIOE_OSPEEDR |= (0x03 << (14 * 2));    
    
    // 设置GPIOED_11为无上拉/下拉    
    *GPIOE_PUPDR &= ~(0x03 << (14 * 2));   

	 
	
	while(1){
		// 亮 ----- GPIOF9输出低电平
		*GPIOF_ODR &= ~(0x01 << 9);
		delay(500);
		
		//灭 ----- GPIOF9输出高电平
		*GPIOF_ODR |= (0x01 << 9);
		delay(500);
		// 亮 ----- GPIOF10输出低电平
		*GPIOF_ODR &= ~(0x01 << 10);
		delay(500);
		
		//灭 ----- GPIOF10输出高电平
		*GPIOF_ODR |= (0x01 << 10);
		delay(500);
		
		// 亮 ----- GPIOE_D10输出低电平
		*GPIOE_ODR &= ~(0x01 << 13);
		delay(500);
		
		//灭 ----- GPIOF9输出高电平
		*GPIOE_ODR |= (0x01 << 13);
		delay(500);
		// 亮 ----- GPIOF9输出低电平
		*GPIOE_ODR &= ~(0x01 << 14);
		delay(500);
		
		//灭 ----- GPIOF9输出高电平
		*GPIOE_ODR |= (0x01 << 14);
		delay(500);
		
		
	}
}

流水綫

cpp 复制代码
#include <stm32f4xx.h>

void delay(uint32_t ms)
{
	int i,j;
	for(i=0;i<ms;i++){
		for(j=0;j<2500;j++);
	}
}

int main()
{
	//GPIOF9、10
	// 指向RCC_AHB1ENR寄存器
    volatile uint32_t *RCC_AHB1ENR=(uint32_t *)(0x40023800+0x30);    
    
	
    // 指向GPIOF_MODER寄存器
    volatile uint32_t *GPIOF_MODER = (uint32_t *)(0x40021400 + 0x00);

    // 指向GPIOF_OTYPER寄存器    
    volatile uint32_t *GPIOF_OTYPER = (uint32_t *)(0x40021400 + 0x04);

    // 指向GPIOF_OSPEEDR寄存器    
    volatile uint32_t *GPIOF_OSPEEDR = (uint32_t *)(0x40021400 + 0x08);

    // 指向GPIOF_PUPDR寄存器
    volatile uint32_t *GPIOF_PUPDR = (uint32_t *)(0x40021400 + 0x0C);

    // 指向GPIOF_ODR寄存器
    volatile uint32_t *GPIOF_ODR = (uint32_t *)(0x40021400 + 0x14);
		
	//GPIOE_D10、D11
    // 指向GPIOE_MODER寄存器
    volatile uint32_t *GPIOE_MODER = (uint32_t *)(0x40021000 + 0x00);

    // 指向GPIOE_OTYPER寄存器    
    volatile uint32_t *GPIOE_OTYPER = (uint32_t *)(0x40021000 + 0x04);

    // 指向GPIOE_OSPEEDR寄存器    
    volatile uint32_t *GPIOE_OSPEEDR = (uint32_t *)(0x40021000 + 0x08);

    // 指向GPIOE_PUPDR寄存器
    volatile uint32_t *GPIOE_PUPDR = (uint32_t *)(0x40021000 + 0x0C);

    // 指向GPIOE_ODR寄存器
    volatile uint32_t *GPIOE_ODR = (uint32_t *)(0x40021000 + 0x14);
	
	//使能GPIOF时钟
	*RCC_AHB1ENR |= 1<<5;
	
	// 设置GPIOF9为输出模式
	*GPIOF_MODER &= ~(0x03 << (9 * 2));
    *GPIOF_MODER |= (0x01 << (9 * 2));
    
    // 设置GPIOF9为推挽输出
    *GPIOF_OTYPER &= ~(0x01 << 9);

    // 设置GPIOF9的速度为高速
    *GPIOF_OSPEEDR |= (0x03 << (9 * 2));    
    
    // 设置GPIOF9为无上拉/下拉    
    *GPIOF_PUPDR &= ~(0x03 << (9 * 2));   

	// 设置GPIOF10为输出模式
	*GPIOF_MODER &= ~(0x03 << (10 * 2));
    *GPIOF_MODER |= (0x01 << (10 * 2));
    
    // 设置GPIOF10为推挽输出
    *GPIOF_OTYPER &= ~(0x01 << 10);

    // 设置GPIOF10的速度为高速
    *GPIOF_OSPEEDR |= (0x03 << (10 * 2));    
    
    // 设置GPIOF10为无上拉/下拉    
    *GPIOF_PUPDR &= ~(0x03 << (10 * 2));   
	
	
	//使能GPIOE时钟
	*RCC_AHB1ENR |= 1<<4;
	
	// 设置GPIOED_10为输出模式
	*GPIOE_MODER &= ~(0x03 << (13 * 2));
    *GPIOE_MODER |= (0x01 << (13 * 2));
    
    // 设置GPIOF10为推挽输出
    *GPIOE_OTYPER &= ~(0x01 << 13);

    // 设置GPIOF10的速度为高速
    *GPIOE_OSPEEDR |= (0x03 << (13 * 2));    
    
    // 设置GPIOF10为无上拉/下拉    
    *GPIOE_PUPDR &= ~(0x03 << (13 * 2)); 
	// 设置GPIOED_11为输出模式
	*GPIOE_MODER &= ~(0x03 << (14 * 2));
    *GPIOE_MODER |= (0x01 << (14 * 2));
    
    // 设置GPIOED_11为推挽输出
    *GPIOE_OTYPER &= ~(0x01 << 14);

    // 设置GPIOED_11的速度为高速
    *GPIOE_OSPEEDR |= (0x03 << (14 * 2));    
    
    // 设置GPIOED_11为无上拉/下拉    
    *GPIOE_PUPDR &= ~(0x03 << (14 * 2));   

	 
	
	while(1){
		// 亮 ----- GPIOF9输出低电平
		*GPIOF_ODR &= ~(0x01 << 9);
		delay(500);
		
		// 亮 ----- GPIOF10输出低电平
		*GPIOF_ODR &= ~(0x01 << 10);
		delay(500);
		
		// 亮 ----- GPIOE_D10输出低电平
		*GPIOE_ODR &= ~(0x01 << 13);
		delay(500);

		// 亮 ----- GPIOF9输出低电平
		*GPIOE_ODR &= ~(0x01 << 14);
		delay(500);
		
		//灭 ----- GPIOF9输出高电平
		*GPIOF_ODR |= (0x01 << 9);
		
		//灭 ----- GPIOF10输出高电平
		*GPIOF_ODR |= (0x01 << 10);
		
		//灭 ----- GPIOF9输出高电平
		*GPIOE_ODR |= (0x01 << 13);
		
		//灭 ----- GPIOF9输出高电平
		*GPIOE_ODR |= (0x01 << 14);
		delay(500);
		delay(500);
	}
}

蜂鸣器

cpp 复制代码
#include <stm32f4xx.h>

void delay(uint32_t ms)
{
	int i,j;
	for(i=0;i<ms;i++){
		for(j=0;j<2500;j++);
	}
}

int main()
{
	//RCC時鐘
	// 指向RCC_AHB1ENR寄存器
	volatile uint32_t *RCC_AHB1ENR=(uint32_t *)(0x40023800+0x30);
	
	volatile uint32_t *GPIOF_MODER=(uint32_t *)(0x40021400+0x00);
	
	volatile uint32_t *GPIOF_OTYPER=(uint32_t *)(0x40021400+0x04);
	
	volatile uint32_t *GPIOF_OSPEEDR=(uint32_t *)(0x40021400+0x08);
	
	volatile uint32_t *GPIOF_PUPDR=(uint32_t *)(0x40021400+0x0C);
	
	volatile uint32_t *GPIOF_ODR=(uint32_t *)(0x40021400+0x14);
	
    *RCC_AHB1ENR|=1<<5;
	
	*GPIOF_MODER&=~(0x03<<(2*8));
	*GPIOF_MODER|=(0x01<<(2*8));
	
	*GPIOF_OTYPER&=~(0x03<<(8));
	
	*GPIOF_OSPEEDR&=~(0x02<<(2*8));
	
	*GPIOF_PUPDR&=~(0x03<<(2*8));
	
	
	while(1){
		
		// 蜂鳴 ----- GPIOF8输出低电平
		*GPIOF_ODR &= ~(0x01 << 8);
		delay(500);
		
		//停止 ----- GPIOF8输出高电平
		*GPIOF_ODR |= (0x01 << 8);
		delay(500);
	}
}
相关推荐
R6bandito_14 分钟前
STM32 HAL库原子操作编译问题解决指南
c语言·ide·经验分享·stm32·单片机·嵌入式硬件·mcu
Jerry丶Li15 分钟前
三十、STM32的USART (串口发送+接收)
stm32·单片机·嵌入式硬件
从零点17 分钟前
STM32连接以太网失败自动重新连接
stm32·单片机·嵌入式硬件
dlwlrma_51622 分钟前
NUCLEO-G0B1RE STM32G0B1RET6的学习(3)——SPI从DMA HAL库到应用层回调函数CallBack的定义
stm32
树在风中摇曳33 分钟前
LeetCode 1658 | 将 x 减到 0 的最小操作数(C语言滑动窗口解法)
c语言·算法·leetcode
不夜牛仔1 小时前
算法笔记17 - 贪心算法介绍与思路 | 路灯摆放问题 | 活动安排问题 | 最低字典序拼接 | 金条分割问题 | 项目投资问题
笔记·算法·贪心算法
python百炼成钢1 小时前
13.RTC实时时钟
linux·stm32·单片机·嵌入式硬件·实时音视频
国科安芯1 小时前
FreeRTOS 在 AS32系列RISC-V 架构MCU电机驱动中的应用实践与优化
单片机·嵌入式硬件·安全·架构·压力测试·risc-v·安全性测试
染予1 小时前
GPIO中断实现流程
单片机·嵌入式硬件
门思科技1 小时前
LoRaWAN通信协议详解:架构、加密机制与核心应用
运维·服务器·网络·嵌入式硬件·物联网