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
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|