| 
 
| 1.程序设计思路 
 (1)配置GPIO端口为输出模式
 
 (2)使用循环控制LED灯闪烁
 
 (3)使用延时函数控制LED灯闪烁 2.GPIOx端口的各寄存器地址和详细参数
 
 GPIOA 端口:
 
 GPIOA_CRL 寄存器:用于配置 GPIOA 的0~7号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。
 
 GPIOA_CRH 寄存器:用于配置 GPIOA 的8~15号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。
 
 GPIOA_BSRR 寄存器:设置 GPIOA 输出的位状态,每个位对应一个管脚,共有4个字节。 GPIOB 端口:
 
 GPIOB_CRL 寄存器:用于配置 GPIOB 的0~7号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。
 
 GPIOB_CRH 寄存器:用于配置 GPIOB 的8~15号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。
 
 GPIOB_BSRR 寄存器:设置 GPIOB 输出的位状态,每个位对应一个管脚,共有4个字节。 GPIOC 端口:
 
 GPIOC_CRL 寄存器:用于配置 GPIOC 的0~7号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。
 
 GPIOC_CRH 寄存器:用于配置 GPIOC 的8~15号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。
 
 GPIOC_BSRR 寄存器:设置 GPIOC 输出的位状态,每个位对应一个管脚,共有4个字节。
 
 3.编程实现
 
 (1)函数封装
 
 实现代码如下
 
 void LED_GPIO_Config(void) { *(unsigned int *)0x40021018 |=(1<<2); *(unsigned int *)0x40021018 |=(1<<3); *(unsigned int *)0x40021018 |=(1<<4);
 
 *(unsigned int *)0x40010800 &=0xFFFFFFF0;
 
 *(unsigned int *)0x40010800 |=0x00000002;
 
 *(unsigned int *)0x40010C04 &=0xFFFFFF0F;
 
 *(unsigned int *)0x40010C04 |=0x00000020;
 
 *(unsigned int *)0x40011004 &=0xFF0FFFFF;
 
 *(unsigned int *)0x40011004 |=0x20000000;
 
 
 
 *(unsigned int *)0x40010800 &=0xFFFFFFF0;
 
 *(unsigned int *)0x40010800 |=0x00000002;
 
 *(unsigned int *)0x40010C04 &=0xFFFFFF0F;
 
 *(unsigned int *)0x40010C04 |=0x00000020;
 
 *(unsigned int *)0x40011004 &=0xFF0FFFFF;
 
 *(unsigned int *)0x40011004 |=0x20000000;
 
 
 
 }
 
 (2)LEDA.LEDB.LEDC闪烁函数
 
 代码如下
 
 void LEDA_LIGHT(){ *(unsigned int *)0x4001080C=0x0<<0; *(unsigned int *)0x40010C0C=0x1<<9; *(unsigned int *)0x4001100C=0x1<<15; } void LEDB_LIGHT(){ *(unsigned int *)0x4001080C=0x1<<0; *(unsigned int *)0x40010C0C=0x0<<9; *(unsigned int *)0x4001100C=0x1<<15; } void LEDC_LIGHT(){ *(unsigned int *)0x4001080C=0x1<<0; *(unsigned int *)0x40010C0C=0x1<<9; *(unsigned int *)0x4001100C=0x0<<15; }
 
 (3)主函数
 
 代码如下
 
 int main(void) { LED_GPIO_Config();
 
 while(1)
 
 {
 
 LEDA_LIGHT();
 
 Delay_ms(1000);
 
 LEDB_LIGHT();
 
 Delay_ms(1000);
 
 LEDC_LIGHT();
 
 Delay_ms(1000);
 
 }
 
 
 
 }
 
 4.将PC13LED编入流水灯中
 
 代码如下
 
 #include "stm32f10x.h" // Device header #include "Delay.h"
 
 int main(void) { RCC->APB2ENR = 0x0000001C; /RCC->APB2ENR = 0x0000001C; GPIOC->CRH = 0x300000; GPIOC->ODR = 0x00000000; Delay_ms(500); GPIOC->ODR = 0x00002000; Delay_ms(500);/ while(1) { RCC->APB2ENR = 0x0000001C; GPIOC->CRH = 0x00300000; GPIOC->ODR = 0x00000000; Delay_ms(500); GPIOC->ODR = 0x00002000; Delay_ms(500);
 
 GPIOA->CRL = 0x00000003;
 
 
 
 GPIOA->ODR = 0x00000001;
 
 Delay_ms(500);
 
 GPIOA->ODR = 0x00000000;
 
 Delay_ms(500);
 
 
 
 GPIOB->CRL = 0x00000003;
 
 
 
 GPIOB->ODR = 0x00000001;
 
 Delay_ms(500);
 
 GPIOB->ODR = 0x00000000;
 
 Delay_ms(500);
 
 
 
 }
 
 
 
 }
 
 5.基于标准外设库实现
 
 (1)首先开启时钟
 
 代码如下
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 
 (2)初始化GPIO
 
 代码如下
 
 GPIO_InitTypeDef GPIO_InitStructure;
 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
 
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 
 
 (3)输入函数控制闪硕
 
 代码如下
 
 while (1) { GPIO_Write(GPIOA, ~0x0001); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0002); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0004); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0008); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0010); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0020); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0040); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0080); Delay_ms(1000); } }
 
 结果如下
 
 
 
 6.通过仿真, 分析闪烁周期
 
 (1)打开keil软件,打开debug,选择ues simulator
 
 (2) 修改dialog dll和parameter
 
 (3) 选择start session
 
 (4) 选择logic analyzer
 
 (5) 选择run输出波形
 
 结果如下
 
 
 
 (6)计算闪烁周期
 ————————————————
 版权声明:本文为CSDN博主「uppp123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 原文链接:https://blog.csdn.net/2302_80163058/article/details/152051426
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |