寄存器
回帖(1)
2021-10-26 15:10:05
汇编语言(Assembly Language)是一种用于电子计算机、微处理器、微控制器或其它可编程器件的低级语言。
在单片机出现之初,由于性能限制,都是使用汇编进行开发。随着技术的发展,制程工艺的提升,单片机的处理速度越来越快,越来越多的单片机使用C语言开发。如今,一些低端MCU还在使用汇编开发;一些高要求程序优化的场合也会使用汇编;MCU/MPU的启动初始化部分也是汇编。本小结就带领读者感受下如何使用汇编操作开发板LED灯。
在编写代码前,本应该分析《开发板原理图》和《参考手册》,从而得知需要操作哪些外设寄存器,但这不是本小结主要内容,具体的分析方法放在后面对应的实验章节,读者暂时无需深入理解以下内容的由 来:
- 从《开发板原理图》可知,控制GPIOB 0引脚,即可控制开发板三色灯的红色灯;
- 从前面STM32总线结构分析可知,GPIOB挂载APB2上,由RCC控制;
- 从前面STM32存储结构分析可知,RCC起始地址为0x4002 1000,再仔细查看《参考手册》RCC寄存器部分,可知寄存器RCC_APB2ENR(偏移地址:0x18)的第3位(IOPBEN),设置为1则GPIO B组的使能;
- 从前面STM32存储结构分析可知,GPIO B起始地址为0x4001 0800,再仔细查看《参考手册》GPIO寄存器部分,可知寄存器GPIOx_CRL(偏移地址:0x00)的第0:1位(MODEy),设置为1则GPIO B0为输出,寄存器GPIOx_ODR(偏移地址:0x0C)的第0位(ODRy),设置为1则GPIO B0为输出高,设置为0则GPIO B0为输出低;
有了以上基础,就可以编程控制LED灯了,本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码 _单片机开发模式的发展1_使用汇编开发”。
如代码段 6.2.1 所示。汇编代码对初学者不友好,读者对代码内容不理解也正常,也无需深入理解汇编指令,这里主要目的是展示如何用汇编操作寄存器。
; Reset handler Reset_Handler PROC ; 使能 GPIOB LDR R0, =(0x40021000 + 0x18) ; RCC_APB2ENR LDR R1, [R0] ORR R1, R1, #(1<<3) STR R1, [R0] ; 设置 GPIOB0 为输出引脚 LDR R0, =(0x40010C00 + 0) ; GPIOB_ CRL LDR R1, [R0] ORR R1, R1, #(1<<0) STR R1, [R0] MainLoop ; 设置 GPIIOB0 输出高电平 LDR R0, =(0x40010C00 + 0xc) ; GPIOB_ODR LDR R1, [R0] ORR R1, R1, #(1<<0) STR R1, [R0] BL Delay ; 设置 GPIIOB0 输出低电平 LDR R0, =(0x40010C00 + 0xc) ; GPIOB_ODR LDR R1, [R0] BIC R1, R1, #(1<<0) STR R1, [R0] BL Delay B MainLoop Delay LDR R0, =300000 DelayLoop SUBS R0, #1 BNE DelayLoop BX LR NOP ENDP END
- 4~8行:设置外部寄存器RCC_APB2ENR的第3位(IOPBEN)为1,使能GPIO B组的时钟;
(1)5行:将0x40021018(RCC_APB2ENR的基地址+偏移地址)放入内部寄存器R0中;
(2)6行:将0x40021018地址的值(此时RCCC_APB2ENR寄存器的值),放入内部寄存器R1;
(3)7行:将R1的Bit3设置为1,并将设置后的结果放入R1;
(4)8行:将R1的内容,放入R0所指向的地址,也就是将修改后的数据放入RCCC_APB2ENR寄存器;
- 10~14行:设置外部寄存器GPIOB_ CRL的第0:1位(MODE)为1,让GPIO B0为输出模式;
- 16~30行:设置外部寄存器GPIOB_ODR的第0位(ODR)先后为1和0,让GPIO B0为输出高、低电平;
- 32~40行:循环减R0实现延时效果;
以上汇编代码就实现了对开发板三色灯的红色灯交替闪烁效果,读者可以打开配套资料的“5_程序源码 _单片机开发模式的发展1_使用汇编开发 ProjectLed_Reg.uvprojx”工程,编译、下载,体验效果。
可以感受到,使用汇编编写程序,生涩难懂,因此越来越少的单片机使用汇编来编写代码,下面再来体验下C语言实现一样的效果。
汇编语言(Assembly Language)是一种用于电子计算机、微处理器、微控制器或其它可编程器件的低级语言。
在单片机出现之初,由于性能限制,都是使用汇编进行开发。随着技术的发展,制程工艺的提升,单片机的处理速度越来越快,越来越多的单片机使用C语言开发。如今,一些低端MCU还在使用汇编开发;一些高要求程序优化的场合也会使用汇编;MCU/MPU的启动初始化部分也是汇编。本小结就带领读者感受下如何使用汇编操作开发板LED灯。
在编写代码前,本应该分析《开发板原理图》和《参考手册》,从而得知需要操作哪些外设寄存器,但这不是本小结主要内容,具体的分析方法放在后面对应的实验章节,读者暂时无需深入理解以下内容的由 来:
- 从《开发板原理图》可知,控制GPIOB 0引脚,即可控制开发板三色灯的红色灯;
- 从前面STM32总线结构分析可知,GPIOB挂载APB2上,由RCC控制;
- 从前面STM32存储结构分析可知,RCC起始地址为0x4002 1000,再仔细查看《参考手册》RCC寄存器部分,可知寄存器RCC_APB2ENR(偏移地址:0x18)的第3位(IOPBEN),设置为1则GPIO B组的使能;
- 从前面STM32存储结构分析可知,GPIO B起始地址为0x4001 0800,再仔细查看《参考手册》GPIO寄存器部分,可知寄存器GPIOx_CRL(偏移地址:0x00)的第0:1位(MODEy),设置为1则GPIO B0为输出,寄存器GPIOx_ODR(偏移地址:0x0C)的第0位(ODRy),设置为1则GPIO B0为输出高,设置为0则GPIO B0为输出低;
有了以上基础,就可以编程控制LED灯了,本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码 _单片机开发模式的发展1_使用汇编开发”。
如代码段 6.2.1 所示。汇编代码对初学者不友好,读者对代码内容不理解也正常,也无需深入理解汇编指令,这里主要目的是展示如何用汇编操作寄存器。
; Reset handler Reset_Handler PROC ; 使能 GPIOB LDR R0, =(0x40021000 + 0x18) ; RCC_APB2ENR LDR R1, [R0] ORR R1, R1, #(1<<3) STR R1, [R0] ; 设置 GPIOB0 为输出引脚 LDR R0, =(0x40010C00 + 0) ; GPIOB_ CRL LDR R1, [R0] ORR R1, R1, #(1<<0) STR R1, [R0] MainLoop ; 设置 GPIIOB0 输出高电平 LDR R0, =(0x40010C00 + 0xc) ; GPIOB_ODR LDR R1, [R0] ORR R1, R1, #(1<<0) STR R1, [R0] BL Delay ; 设置 GPIIOB0 输出低电平 LDR R0, =(0x40010C00 + 0xc) ; GPIOB_ODR LDR R1, [R0] BIC R1, R1, #(1<<0) STR R1, [R0] BL Delay B MainLoop Delay LDR R0, =300000 DelayLoop SUBS R0, #1 BNE DelayLoop BX LR NOP ENDP END
- 4~8行:设置外部寄存器RCC_APB2ENR的第3位(IOPBEN)为1,使能GPIO B组的时钟;
(1)5行:将0x40021018(RCC_APB2ENR的基地址+偏移地址)放入内部寄存器R0中;
(2)6行:将0x40021018地址的值(此时RCCC_APB2ENR寄存器的值),放入内部寄存器R1;
(3)7行:将R1的Bit3设置为1,并将设置后的结果放入R1;
(4)8行:将R1的内容,放入R0所指向的地址,也就是将修改后的数据放入RCCC_APB2ENR寄存器;
- 10~14行:设置外部寄存器GPIOB_ CRL的第0:1位(MODE)为1,让GPIO B0为输出模式;
- 16~30行:设置外部寄存器GPIOB_ODR的第0位(ODR)先后为1和0,让GPIO B0为输出高、低电平;
- 32~40行:循环减R0实现延时效果;
以上汇编代码就实现了对开发板三色灯的红色灯交替闪烁效果,读者可以打开配套资料的“5_程序源码 _单片机开发模式的发展1_使用汇编开发 ProjectLed_Reg.uvprojx”工程,编译、下载,体验效果。
可以感受到,使用汇编编写程序,生涩难懂,因此越来越少的单片机使用汇编来编写代码,下面再来体验下C语言实现一样的效果。
举报
更多回帖