完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、最近初学了单片机,开发板用的是星火的指南者。
2、点灯程序没有直接使用官方的固件库,而是直接操作了寄存器的地址,这样比较直观的看到根源,毕竟库是封装过一层。 3、点灯一共分为3步:打开时钟、配置端口寄存器、配置ODR寄存器 4、下面直接上图: 这里三个灯都属于寄存器的低8位,所以配置端口寄存器的时候使用低端口寄存器CRL 5.开始查找手册,PB引脚属于GPIO_B,所以要电亮灯,要是的GPIO_B的ODR寄存器的0,1,5位,分别置低电平,使得3.3v下拉,电亮灯 6.GPIO_B基地址0x4001 0400,ODR偏移地址0C,CRL偏移地址00,手册可查 7.从手册上看RTC时钟属于AHB总线,查找手册起始地址为0x4002 1000,偏移0x18 8.下面是代码 #include "stm32f10x.h" void delay(int time) { int i=0; while(time--) { i=12000; while(i--) ; } } int main(void) { //GPIO_B的时钟打开 *(unsigned*)0x40021018 |= ((1)<< 3); while(1) { //绿:配置ODR寄存器最低位为低电平 *(unsigned*)0x40010C00 |= ((1)<<(4*0)); *(unsigned*)0x40010C0C &=~(1<<0); delay(50); *(unsigned*)0x40010C0C |=(1<<0); //红:配置ODR寄存器最低位为低电平 //delay(100); *(unsigned*)0x40010C00 |= ((1)<<(4*5)); *(unsigned*)0x40010C0C &=~(1<<5); delay(50); *(unsigned*)0x40010C0C |=(1<<5); //蓝:配置ODR寄存器最低位为低电平 //delay(100); *(unsigned*)0x40010C00 |= ((1)<<(4*1)); *(unsigned*)0x40010C0C &=~(1<<1); delay(50); *(unsigned*)0x40010C0C |=(1<<1); } } void SystemInit(void) { } 这里有两个坑的地方就是,开灯以后记得关闭,不然循环不起来,会导致最后一个灯常亮,还有个就是关闭之前加个延时,不然灯都不亮了 |
|
|
|
1、最近初学了单片机,开发板用的是星火的指南者。
2、点灯程序没有直接使用官方的固件库,而是直接操作了寄存器的地址,这样比较直观的看到根源,毕竟库是封装过一层。 3、点灯一共分为3步:打开时钟、配置端口寄存器、配置ODR寄存器 4、下面直接上图: 这里三个灯都属于寄存器的低8位,所以配置端口寄存器的时候使用低端口寄存器CRL 5.开始查找手册,PB引脚属于GPIO_B,所以要电亮灯,要是的GPIO_B的ODR寄存器的0,1,5位,分别置低电平,使得3.3v下拉,电亮灯 6.GPIO_B基地址0x4001 0400,ODR偏移地址0C,CRL偏移地址00,手册可查 7.从手册上看RTC时钟属于AHB总线,查找手册起始地址为0x4002 1000,偏移0x18 8.下面是代码 #include "stm32f10x.h" void delay(int time) { int i=0; while(time--) { i=12000; while(i--) ; } } int main(void) { //GPIO_B的时钟打开 *(unsigned*)0x40021018 |= ((1)<< 3); while(1) { //绿:配置ODR寄存器最低位为低电平 *(unsigned*)0x40010C00 |= ((1)<<(4*0)); *(unsigned*)0x40010C0C &=~(1<<0); delay(50); *(unsigned*)0x40010C0C |=(1<<0); //红:配置ODR寄存器最低位为低电平 //delay(100); *(unsigned*)0x40010C00 |= ((1)<<(4*5)); *(unsigned*)0x40010C0C &=~(1<<5); delay(50); *(unsigned*)0x40010C0C |=(1<<5); //蓝:配置ODR寄存器最低位为低电平 //delay(100); *(unsigned*)0x40010C00 |= ((1)<<(4*1)); *(unsigned*)0x40010C0C &=~(1<<1); delay(50); *(unsigned*)0x40010C0C |=(1<<1); } } void SystemInit(void) { } 这里有两个坑的地方就是,开灯以后记得关闭,不然循环不起来,会导致最后一个灯常亮,还有个就是关闭之前加个延时,不然灯都不亮了 |
|
|
|
1、最近初学了单片机,开发板用的是星火的指南者。
2、点灯程序没有直接使用官方的固件库,而是直接操作了寄存器的地址,这样比较直观的看到根源,毕竟库是封装过一层。 3、点灯一共分为3步:打开时钟、配置端口寄存器、配置ODR寄存器 4、下面直接上图: 这里三个灯都属于寄存器的低8位,所以配置端口寄存器的时候使用低端口寄存器CRL 5.开始查找手册,PB引脚属于GPIO_B,所以要电亮灯,要是的GPIO_B的ODR寄存器的0,1,5位,分别置低电平,使得3.3v下拉,电亮灯 6.GPIO_B基地址0x4001 0400,ODR偏移地址0C,CRL偏移地址00,手册可查 7.从手册上看RTC时钟属于AHB总线,查找手册起始地址为0x4002 1000,偏移0x18 8.下面是代码 #include "stm32f10x.h" void delay(int time) { int i=0; while(time--) { i=12000; while(i--) ; } } int main(void) { //GPIO_B的时钟打开 *(unsigned*)0x40021018 |= ((1)<< 3); while(1) { //绿:配置ODR寄存器最低位为低电平 *(unsigned*)0x40010C00 |= ((1)<<(4*0)); *(unsigned*)0x40010C0C &=~(1<<0); delay(50); *(unsigned*)0x40010C0C |=(1<<0); //红:配置ODR寄存器最低位为低电平 //delay(100); *(unsigned*)0x40010C00 |= ((1)<<(4*5)); *(unsigned*)0x40010C0C &=~(1<<5); delay(50); *(unsigned*)0x40010C0C |=(1<<5); //蓝:配置ODR寄存器最低位为低电平 //delay(100); *(unsigned*)0x40010C00 |= ((1)<<(4*1)); *(unsigned*)0x40010C0C &=~(1<<1); delay(50); *(unsigned*)0x40010C0C |=(1<<1); } } void SystemInit(void) { } 这里有两个坑的地方就是,开灯以后记得关闭,不然循环不起来,会导致最后一个灯常亮,还有个就是关闭之前加个延时,不然灯都不亮了 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1169浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 23:50 , Processed in 1.150440 second(s), Total 83, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号