在使用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
关注
打赏
热门博文
- 韦东山freeRTOS系列教程:入门文档教程+进阶视频教程(全部免费的freeRTOS系列教程、freeRTOS学习路线)
- 韦东山嵌入式Linux三大学习路线
- 新人怎样学习嵌入式Linux?
- 【RTOS训练营】作业讲解、队列和环形缓冲区、队列——传输数据、队列——同步任务和晚课提问
- 【RTOS训练营】任务调度(续)、任务礼让、调度总结、队列和晚课提问
- 【RTOS训练营】上节回顾、空闲任务、定时器任务、执行顺序、调度策略和晚课提问
- 【RTOS训练营】设备子系统、晚课学员提问
- 【RTOS训练营】继续程序框架、tick中断补充、预习、课后作业和晚课提问
- 【RTOS训练营】程序框架、预习、课后作业和晚课提问
- 【RTOS训练营】环形缓冲区、AT指令、预习安排和晚课提问