- 一、GPIO端口初始化
- 1.时钟配置
- 2.输入输出模式和输出速率设置
- 二、代码实现
- 1.c语言
- 2.汇编代码
- 三、效果
- 四、总结
- 五、参考
本次实验采用GPIOA、B、C三个端口。该三个端口都属于APB2总线
-
找到时钟使能寄存器映射基地址
-
找到端口偏移地址以及对应端口所在位置
-
使能对应端口时钟
//----------------APB2使能时钟寄存器 --------------------- #define RCC_APB2ENR *((unsigned volatile int*)0x40021018) RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能2.输入输出模式和输出速率设置
本次实验采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A4、B5、C14三个引脚。其中A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。
- 找到GPIOx端口基地址
- 配置对应引脚寄存器,基地址+偏移量
//----------------GPIOA配置寄存器 ----------------------- #define GPIOA_CRL *((unsigned volatile int*)0x40010800) //----------------GPIOB配置寄存器 ----------------------- #define GPIOB_CRL *((unsigned volatile int*)0x40010C00) //----------------GPIOC配置寄存器 ----------------------- #define GPIOC_CRH *((unsigned volatile int*)0x40011004)
- 设置输出模式为推挽输出,输出速度为2Mhz
GPIOA_CRL&=0xFFF0FFFF; //设置位 清零 GPIOA_CRL|=0x00020000; //PA4推挽输出,把第19、18、17、16位变为0010 GPIOB_CRL&=0xFF0FFFFF; //设置位 清零 GPIOB_CRL|=0x00200000; //PB5推挽输出,把第23、22、21、20变为0010 GPIOC_CRH&=0xFF0FFFFF; //设置位 清零 GPIOC_CRH|=0x00200000; //PC14推挽输出,把第23、22、21、20变为0010二、代码实现 1.c语言
代码如下
#include "stm32f10x.h" //----------------APB2使能时钟寄存器 --------------------- #define RCC_APB2ENR *((unsigned volatile int*)0x40021018) //----------------GPIOA配置寄存器 ----------------------- #define GPIOA_CRL *((unsigned volatile int*)0x40010800) #define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //----------------GPIOB配置寄存器 ----------------------- #define GPIOB_CRL *((unsigned volatile int*)0x40010C00) #define GPIOB_ODR *((unsigned volatile int*)0x40010C0C) //----------------GPIOC配置寄存器 ----------------------- #define GPIOC_CRH *((unsigned volatile int*)0x40011004) #define GPIOC_ODR *((unsigned volatile int*)0x4001100C) //延时函数 void Delay() { u32 i=0; for(;i<5000000;i++); } int main(void) { RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能 GPIOA_CRL&=0xFFF0FFFF; //设置位 清零 GPIOA_CRL|=0x00020000; //PB5推挽输出 GPIOA_ODR&=~(1<<4); //设置初始灯为灭 GPIOB_CRL&=0xFF0FFFFF; //设置位 清零 GPIOB_CRL|=0x00200000; //PB5推挽输出 GPIOB_ODR&=~(1<<5); //设置初始灯为灭 GPIOC_CRH&=0xF0FFFFFF; //设置位 清零 GPIOC_CRH|=0x02000000; //PB5推挽输出 GPIOC_ODR&=~(1<<14); //设置初始灯为灭 while(1){ //A灯 GPIOA_ODR|=1<<4; //PB5高电平 Delay(); GPIOA_ODR&=~(1<<4); //PB5低电平,因为是置0,所以用按位与 Delay(); //B灯 GPIOB_ODR|=1<<5; //PB5高电平 Delay(); GPIOB_ODR&=~(1<<5); //PB5低电平,因为是置0,所以用按位与 Delay(); //C灯 GPIOC_ODR|=1<<14; //PB5高电平 Delay(); GPIOC_ODR&=~(1<<14); //PB5低电平,因为是置0,所以用按位与 Delay(); } }2.汇编代码
代码如下
AREA MYDATA, DATA AREA MYCODE, CODE ENTRY EXPORT led led ;使能A,B,C ldr r0, =0x40021018 ldr r1, =0x0000001c str r1, [r0] ;配置端口A4 ldr r0, =0x40010800 ldr r1, [r0] bic r1, r1, #0x000f0000 orr r1, r1, #0x00010000 str r1, [r0] ;配置端口B5 ldr r0, =0x40010c00 ldr r1, [r0] bic r1, r1, #0x00f00000 orr r1, r1, #0x00100000 str r1, [r0] ;配置端口C14 ldr r0, =0x40011004 ldr r1, [r0] bic r1, r1, #0x0f000000 orr r1, r1, #0x01000000 str r1, [r0] ;初始为A4亮灯 ldr r0, =0x4001080c ldr r1, =0x00000010 str r1, [r0] ldr r0, =5000000;频率 ldr r1, =0 ;循环亮灯 blink add r1, r1, #1 cmp r1, r0 blt blink ;A4灭 ldr r1, =0x4001080c ldr r2, [r1] eor r2, r2, #0x00000010 str r2, [r1] ;B5亮 ldr r1, =0x40010c0c ldr r2, [r1] eor r2, r2, #0x00000020 str r2, [r1] ldr r1, =0 blink1 add r1, r1, #1 cmp r1, r0 blt blink1 ;B5灭 ldr r1, =0x40010c0c ldr r2, [r1] eor r2, r2, #0x00000020 str r2, [r1] ;C14亮 ldr r1, =0x4001100c ldr r2, [r1] eor r2, r2, #0x00004000 str r2, [r1] ldr r1, =0 blink2 add r1, r1, #1 cmp r1, r0 blt blink2 ;C14灭 ldr r1, =0x4001100c ldr r2, [r1] eor r2, r2, #0x00004000 str r2, [r1] ;A4亮 ldr r1, =0x4001080c ldr r2, [r1] eor r2, r2, #0x00000010 str r2, [r1] ldr r1, =0 b blink END三、效果 四、总结
1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理
2、了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)
1.https://blog.csdn.net/gelad_w/article/details/115555631
2.https://blog.csdn.net/qq_26174161/article/details/108210382
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)