C 语言操作寄存器开发

在使用C语言操作寄存器前,仍需要先分析《开发板原理图》和《参考手册》,从而得知需要操作哪些外设寄存器,假设读者已经了解需要操作哪些外设寄存器。

本章涉及的代码位于100ASK_STM32F103开发板资料的“5_程序源码\0_单片机开发模式的发展\2_C语言操作寄存器开发\”。

使用C语言之前,需要先设置栈,如代码段 6.3.1 所示,在上电复位后立即设置栈,随后跳入main函数执行。

代码段 6.3.1 设置栈(startup_stm32f10x_hd.s)

; Reset handler
Reset_Handler PROC
IMPORT main
LDR SP, =0x20000000+0x100
BL main
ENDP
END

代码段 6.3.2 C 语言操作寄存器(main.c)

#define RCC_APB2ENR (0x40021000 + 0x18)
#define GPIOB_BASE (0x40010C00)
#define GPIOB_CRL (GPIOB_BASE + 0)
#define GPIOB_ODR (GPIOB_BASE + 0X0c)
void delay(volatile long i)
{
     
while (i--);
}
int main(void) {
     
volatile unsigned int *pRccApb2Enr;
volatile unsigned int *pGpiobCrl;
volatile unsigned int *pGpiobOdr;
pRccApb2Enr = (volatile unsigned int *)RCC_APB2ENR;
pGpiobCrl = (volatile unsigned int *)GPIOB_CRL;
pGpiobOdr = (volatile unsigned int *)GPIOB_ODR;
/* 1. 使能 GPIOB 的时钟
* GPIO 是挂载在 APB2 上的,所以我们要使能 APB2 的外设时钟使能位
* 芯片手册 113 页 RCC_APB2ENR 寄存器描述中我们可以看到 APB2ENR[8:2]是 GPIO[G:A]时钟的控制位,控制 GPIO 时钟是失能或者使能
* 开发板上的 LED 的 GPIO 组是使用的 GPIOB,即要使能 APB2ENR[3]位,为其赋值“1”即可打开 GPIOB 的时钟 */
*pRccApb2Enr |= (1<<3);
/* 2. 设置 GPIO 为输出功能: * MODE_0=1,PB0 输出模式,输出速率最大 10MHz
*/
*pGpiobCrl |= (1<<0);
while (1) {
     *pGpiobOdr |= (1<<0);
delay(1000000); *pGpiobOdr &= ~(1<<0);
delay(1000000); } }

主函数如代码段 6.3.2 所示。

  • 1~4行:用宏定义了需要用到的各外设寄存器地址:RCC_APB2ENR、GPIOB_ CRL、GPIOB_ODR;

  • 6~9行:循环递减传入的变量i,实现延时效果;

  • 13~15行:定义指针变量;

  • 17~19行:设置指针指向对应寄存器;

  • 25~30行:设置RCC_APB2ENR、GPIOB_ CRL对应位;

  • 32~38行:循环修改GPIOB_ODR实现LED灯交替闪烁;

以上代码就实现了对开发板三色灯的红色灯交替闪烁效果,读者可以打开配套资料的“5_程序源码\0_单片机编程模式的发展\ 2_C语言操作寄存器开发\ Project\Led_Reg.uvprojx”工程,编译、下载,体验效果。

使用C语言后,只需定义指针变量指向对应寄存器,修改该指针变量的值,即可修改对应寄存器,操作上方便了很多。


百问网技术论坛:
http://bbs.100ask.net/

百问网嵌入式视频官网:
https://www.100ask.net/index

百问网开发板:
淘宝:https://100ask.taobao.com/
天猫:https://weidongshan.tmall.com/

技术交流群(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
QQ群:869222007(已满)752871361

单片机-嵌入式Linux交流群:
QQ群:536785813

你可能感兴趣的:(单片机F103开发大全,嵌入式,单片机,c语言,c++)