完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、STM32F103的映射介绍
1.地址映射介绍
[tr]总线类型作用[/tr]
2.寄存器映射的介绍
[tr]寄存器名称寄存器地址[/tr]
二、GPIO端口的初始化设置 1.GIPO简介
[tr]分类工作模式[/tr]
2.时钟配置 对于STM32,有五个时钟源,如下表: [tr]简称时钟源名称频率范围[/tr]
3.输入输出模式设置
[tr]输入模式名称作用原理[/tr]
[tr]输出模式名称作用原理[/tr]
注:在使用任何一种开漏模式,都需要接上拉电阻。 4.最大速率设置
三、实例——流水灯 1.实例目标 以 STM32最小系统核心板(STM32F103C8T6)+面包板+3只红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒 2.面包板
4.代码 汇编代码: LED0 EQU 0x42218194 RCC_APB2ENR EQU 0x40021018 GPIOA_CRH EQU 0x40010804 GPIOB_CRL EQU 0x40010C00 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp AREA RESET, DATA, READONLY __Vectors DCD __initial_sp DCD Reset_Handler AREA |.text|, CODE, READONLY THUMB REQUIRE8 PRESERVE8 ENTRY Reset_Handler BL LED_Init MainLoop BL LED_ON BL Delay BL LED_OFF BL Delay B MainLoop LED_Init PUSH {R0,R1, LR} LDR R0,=RCC_APB2ENR ORR R0,R0,#0x08 LDR R1,=RCC_APB2ENR STR R0,[R1] LDR R0,=GPIOB_CRL BIC R0,R0,#0XFF0FFFFF LDR R1,=GPIOB_CRL STR R0,[R1] LDR R0,=GPIOB_CRL ORR R0,R0,#0X00300000 LDR R1,=GPIOB_CRL STR R0,[R1] MOV R0,#1 LDR R1,=LED0 STR R0,[R1] POP {R0,R1,PC} LED_ON PUSH {R0,R1, LR} MOV R0,#0 LDR R1,=LED0 STR R0,[R1] POP {R0,R1,PC} LED_OFF PUSH {R0,R1, LR} MOV R0,#1 LDR R1,=LED0 STR R0,[R1] POP {R0,R1,PC} Delay PUSH {R0,R1, LR} MOVS R0,#0 MOVS R1,#0 MOVS R2,#0 DelayLoop0 ADDS R0,R0,#1 CMP R0,#330 BCC DelayLoop0 MOVS R0,#0 ADDS R1,R1,#1 CMP R1,#330 BCC DelayLoop0 MOVS R0,#0 MOVS R1,#0 ADDS R2,R2,#1 CMP R2,#15 BCC DelayLoop0 POP {R0,R1,PC} END C语言代码: //--------------APB2使能时钟寄存器------------------------ #define RCC_AP2ENR *((unsigned volatile int*)0x40021018) //----------------GPIOB配置寄存器---------------------- #define GPIOA_CRL *((unsigned volatile int*)0x40010800) #define GPIOA_ORD *((unsigned volatile int*)0x4001080C) //----------------GPIOC配置寄存器------------------------ #define GPIOB_CRH *((unsigned volatile int*)0x40010C04) #define GPIOB_ORD *((unsigned volatile int*)0x40010C0C) //----------------GPIOD配置寄存器------------------------ #define GPIOC_CRH *((unsigned volatile int*)0x40011004) #define GPIOC_ORD *((unsigned volatile int*)0x4001100C) //-------------------延时函数----------------------- void Delay_ms( volatile unsigned int t) { unsigned int i; while(t--) for (i=0;i<10000;i++); } void A_LED_LIGHT(){ GPIOA_ORD=0x0<<7; GPIOB_ORD=0x1<<9; GPIOC_ORD=0x1<<15; } void B_LED_LIGHT(){ GPIOA_ORD=0x1<<7; GPIOB_ORD=0x0<<9; GPIOC_ORD=0x1<<15; } void C_LED_LIGHT(){ GPIOA_ORD=0x1<<7; GPIOB_ORD=0x1<<9; GPIOC_ORD=0x0<<15; } int main() { int j=100; RCC_AP2ENR|=1<<2; RCC_AP2ENR|=1<<3; RCC_AP2ENR|=1<<4; GPIOA_CRL&=0x0FFFFFFF; GPIOA_CRL|=0x20000000; GPIOA_ORD|=1<<7; GPIOB_CRH&=0xFFFFFF0F; GPIOB_CRH|=0x00000020; GPIOB_ORD|=1<<9; GPIOC_CRH&=0x0FFFFFFF; GPIOC_CRH|=0x30000000; GPIOC_ORD|=0x1<<15; while(1) { A_LED_LIGHT(); Delay_ms(1000); B_LED_LIGHT(); Delay_ms(1000); C_LED_LIGHT(); Delay_ms(1000); } } 5.注意事项 (1)关于.hex文件的生成
(2)电路的连接
(3)程序的烧录
红、绿、黄灯依次闪烁,且时间间隔为1s 四、总结 本篇博客介绍了STM32F103单片机的地址映射和寄存器映射,介绍了GPIO初始化设置,阐述了时钟配置,八种输入输出配置以及最大速率配置,并通过实例——流水灯,将理论的学习运用到实践中,希望能够给各位读者帮助,同时也希望各位读者能够自己尝试去实验,只有通过实验才能够真正熟知和掌握知识。若博客中有不足或者缺漏,望各位指出。 |
||
|
||
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
3363 浏览 0 评论
3370 浏览 9 评论
3061 浏览 16 评论
3551 浏览 1 评论
9182 浏览 16 评论
1305浏览 3评论
671浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
663浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2411浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1978浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-24 10:57 , Processed in 1.363072 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191