STM32 FT429 使用寄存器点亮LED
最近开始学习野火F429挑战者教程
电路分析
LED电路分析:
- 左端跳帽置1
- 右端PH10-12为IO端 分别对应红绿蓝
- 其中PH10中 PH对应GPIOH 10对应第十位
则当PH10/11/12置0时打通电路灯亮,置1时则两边都为高电平,灯则不亮
地址分析
找到GPIOH的基地址为0X40021C00
找到对应寄存器的偏移地址为0x14
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oxTmp4fa-1663962923685)(https://picture-1309470925.cos.ap-chengdu.myqcloud.com/pic/image-20220924014444410.png)]
编写代码
此时的源代码
stm32f4xx.h
/*宏定义存放寄存器地址映射的代码*/
#define GPIOH_ODR *(unsigned int*)(0x40021C00+0x14)//0x40021C00为GPIOH的基地址,0X14为偏移地址
main.c
#include"stm32f4xx.h"
int main(void){
GPIOH_ODR &= ~(1>>10);
while(1);
}
//HSI = 16M
//设置为空骗系统不报错
void SystemInit(void){
}
编译结果
Build started: Project: led_light
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling main.c...
linking...
Program Size: Code=348 RO-data=444 RW-data=0 ZI-data=2144
".\Objects\led_light.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01
但是最终烧录进单片机时却没有亮红灯,为什么呢?
因为在stm32里面默认IO只有输入,若想要输出则需要更改其他寄存器
若想要控制ph10 则需要修改对应该寄存器上21-20位的值
修改后的代码
#include"stm32f4xx.h"
/*宏定义存放寄存器地址映射的代码*/
//0x40021C00为GPIOH的基地址,0X14为偏移地址
#define GPIOH_ODR *(unsigned int*)(0x40021C00+0x14)
#define GPIOH_MODER *(unsigned int*)(0x40021C00+0x00)
int main(void){
//配置PH10为输出
GPIOH_MODER|=(1<<(2*10));
//配置ph10为低电平
GPIOH_ODR &= ~(1<<10);
while(1);
}
//HSI = 16M
//设置为空骗系统不报错
void SystemInit(void){
}
编译烧录后还是不行,为什么呢?
因为stm32属于是较为先进的单片机,默认外设时钟都是关闭的,若需要开启则需要手动开启
找到管控GPIOH寄存器的时钟寄存器 基地址为 0x40023800 偏移地址为0x30 且在该寄存器上的第7位
/*宏定义存放寄存器地址映射的代码*/
//0x40021C00为GPIOH的基地址,0X14为偏移地址
#define GPIOH_ODR *(unsigned int*)(0x40021C00+0x14)
#define GPIOH_MODER *(unsigned int*)(0x40021C00+0x00)
#define RCC_AHB1ENR *(unsigned int*)(0x40023800+0x30)
#include"stm32f4xx.h"
int main(void){
//打开GPIOH的时钟
RCC_AHB1ENR |= (1<<7);
//配置PH10为输出
GPIOH_MODER|=(1<<(2*10));
//配置ph10为低电平
GPIOH_ODR &= ~(1<<10);
while(1);
}
//HSI = 16M
//设置为空骗系统不报错
void SystemInit(void){
}
烧录后发现还是不行…
原因…
要勾上这个.具体原因还要等以后学习
成功点亮
若需要实现闪烁的效果
#include"stm32f4xx.h"
void Led_delay(unsigned int count){
for(;count>0;count--);
}
int main(void){
//打开GPIOH的时钟
RCC_AHB1ENR |= (1<<7);
//配置PH10为输出
GPIOH_MODER|=(1<<(2*10));
while(1){
//配置ph10为低电平 亮
GPIOH_ODR &= ~(1<<10);
Led_delay(0xEFFFF);//数字太小可能因为过快而无法发觉
GPIOH_ODR |= 1<<10;
Led_delay(0xEFFFF);
}
}
//HSI = 16M
//设置为空骗系统不报错
void SystemInit(void){
}
ODR &= ~(1<<10);
Led_delay(0xEFFFF);//数字太小可能因为过快而无法发觉
GPIOH_ODR |= 1<<10;
Led_delay(0xEFFFF);
}
}
//HSI = 16M
//设置为空骗系统不报错
void SystemInit(void){
}
万事开头难,第一天配环境+学习了这些内容.加油!