LED点灯
LED红灯点亮代码
步骤
Step I : \textbf{Step I}: Step I:时钟处理
GPIO需要复位和时钟控制 (RCC)
根据参考手册:
![](https://i-blog.csdnimg.cn/blog_migrate/cce554b81d8b9873047ac6f06b9e0406.png)
因此可知RCC初始边界地址0x40023800
![](https://i-blog.csdnimg.cn/blog_migrate/84d7750424d40318e7f8ecd162df7956.png)
可见偏移地址是0x30
而GPIOF的位数需要左移5位
/*打开GPIO端口时钟*/
*(unsigned int *)(0x40023800+0x30) |= (1<<5)//1是置为高电平,<<5是左移5位
Step II : \textbf{Step II}: Step II:设置寄存器GPIO端口模式
查询原理图,确认调试哪个接口
![](https://i-blog.csdnimg.cn/blog_migrate/5713706689f118adeff9b74907cf0db7.png)
根据原理图可以发现:如果点亮红灯,那么只需要让PF6为低电平
查询参考手册:
![](https://i-blog.csdnimg.cn/blog_migrate/ec220b6ddb32abcc04fd648e7062a82b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ad4efd38bbe951bd826f094118073837.png)
并且由参考手册得知:GPIOF端口的MODER边界地址0x4002 1400
,偏移地址:0x00
/*定义GPIOF_MODER的状态*/
*(unsigned int *)(0x40021400+0x00) &=~((0x03)<<(2*6));
//(0x03)<<(2*6): 首先,将左移2*6位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
*(unsigned int *)(0x40021400+0x00) |= (1<<(2*6));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
Step III : \textbf{Step III}: Step III:设置寄存器GPIO输出
同样用参考手册定义:
/*定义GPIOF_ODR的输出状态*/
*(unsigned int *)(0x40021400+0x14) &=~ (1<<6);//PF6输出低电平
代码
初始代码
#include "STM32F4xx.h"
int main(){
/*打开GPIO端口时钟*/
*(unsigned int *)(0x40023800+0x30) |= (1<<5);
//1是置为高电平,<<5是左移5位
/*定义GPIOF_MODER的状态*/
*(unsigned int *)(0x40021400+0x00) &=~((0x03)<<(2*6));
//(0x03)<<(2*6): 首先,将左移2*6位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
*(unsigned int *)(0x40021400+0x00) |= (1<<(2*6));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
/*定义GPIOF_ODR的输出状态*/
*(unsigned int *)(0x40021400+0x14) &=~ (1<<6);//PF6输出低电平
}
void SystemInit(void ){
}
集成宏定义
main.c
#include "STM32F4xx.h"
int main(){
/*打开GPIO端口时钟*/
RCC_AHB1ENR |= (1<<5);
//1是置为高电平,<<5是左移5位
/*定义GPIOF_MODER的状态*/
GPIOF_MODER &=~((0x03)<<(2*7));
//(0x03)<<(2*6): 首先,将左移2*6位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
GPIOF_MODER |= (1<<(2*7));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
/*定义GPIOF_ODR的输出状态*/
GPIOF_ODR &=~ (1<<7);//PF6输出低电平
}
void SystemInit(void ){
}
STM32F4xx.h
/* 用来存放寄存器映射相关代码 */
#define RCC_AHB1ENR *(unsigned int *)(0x40023800+0x30)
#define GPIOF_MODER *(unsigned int *)(0x40021400+0x00)
#define GPIOF_ODR *(unsigned int *)(0x40021400+0x14)
烧录易错:
LED中RGB点灯项目
点亮白灯,黄灯etc.
#include "STM32F4xx.h"
int main(){
/*打开GPIO端口时钟*/
RCC_AHB1ENR |= (1<<5);
//1是置为高电平,<<5是左移5位
红灯
/*定义GPIOF_MODER的状态*/
GPIOF_MODER &=~((0x03)<<(2*6));
//(0x03)<<(2*6): 首先,将左移2*6位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
GPIOF_MODER |= (1<<(2*6));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
/*定义GPIOF_ODR的输出状态*/
GPIOF_ODR &=~ (1<<6);//PF6输出低电平
绿灯
/*定义GPIOF_MODER的状态*/
GPIOF_MODER &=~((0x03)<<(2*7));
//(0x03)<<(2*7): 首先,将左移2*7位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
GPIOF_MODER |= (1<<(2*7));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
/*定义GPIOF_ODR的输出状态*/
GPIOF_ODR &=~ (1<<7);//PF7输出低电平
蓝灯
/*定义GPIOF_MODER的状态*/
GPIOF_MODER &=~((0x03)<<(2*8));
//(0x03)<<(2*6): 首先,将左移2*6位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
GPIOF_MODER |= (1<<(2*8));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
/*定义GPIOF_ODR的输出状态*/
GPIOF_ODR &=~ (1<<8);//PF8输出低电平
}
void SystemInit(void ){
}
顺序点亮灯
这里有软件延时和硬件延时两种方式,我们先采用软件延时:
/*采用软件延迟*/
void Delay(unsigned int count){
for( ;count!=0 ; count--);
}
综合的代码:
#include "STM32F4xx.h"
/*采用软件延迟*/
void Delay(unsigned int count){
for( ;count!=0 ; count--);
}
int main(){
/*打开GPIO端口时钟*/
RCC_AHB1ENR |= (1<<5);
//1是置为高电平,<<5是左移5位
红灯
/*定义GPIOF_MODER的状态*/
GPIOF_MODER &=~((0x03)<<(2*6));
//(0x03)<<(2*6): 首先,将左移2*6位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
GPIOF_MODER |= (1<<(2*6));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
绿灯
/*定义GPIOF_MODER的状态*/
GPIOF_MODER &=~((0x03)<<(2*7));
//(0x03)<<(2*7): 首先,将左移2*7位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
GPIOF_MODER |= (1<<(2*7));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
蓝灯
/*定义GPIOF_MODER的状态*/
GPIOF_MODER &=~((0x03)<<(2*8));
//(0x03)<<(2*8): 首先,将左移2*8位的端口变成"11",而其余地方变成"00"
//~(): 然后取反,得到左移的端口变成"00",而其余地方变成"11"
GPIOF_MODER |= (1<<(2*8));
//这样将GPIOF的MODER变成"01",而其余地方变成"11"
/*定义GPIOF_ODR的输出状态*/
while(1){
GPIOF_ODR &=~ (1<<6); //亮灯
Delay(0x0FFFFF); //延时
GPIOF_ODR |= (1<<6); //灭灯
Delay(0x0FFFFF); //延时
GPIOF_ODR &=~ (1<<7); //亮灯
Delay(0x0FFFFF); //延时
GPIOF_ODR |= (1<<7); //灭灯
Delay(0x0FFFFF); //延时
GPIOF_ODR &=~ (1<<8); //亮灯
Delay(0x0FFFFF); //延时
GPIOF_ODR |= (1<<8); //灭灯
Delay(0x0FFFFF); //延时
}
}
void SystemInit(void ){
}