蓝桥杯嵌入式方向小白指南(1)——LED指示灯
该开发板上LED并非与芯片引脚直接相连,而是通过锁存器SN74HC573ADWR连在一起的,芯片PD2口与锁存器LE使能端相连,PC8-PC15分别与LD1-LD8对应相连。当锁存使能(LE)输入为高电平时,Q 输出响应数据(D)输入,锁存器处于透明模式,输出会随输入数据的变化而变化;当 LE 为低电平时,锁存器将存储 D 输入上的信息,输出保持不变,直到下一次 LE 变为高电平。由电路图可知,L
嵌入式赛道主控为STM32G431RBT6,实验开发板为国信长天的CT117E-M4,STM32CubeMX 是用于 32 位 ARM Cortex STM32微控制器的图形工具。
一.LED指示灯介绍
该开发板上LED并非与芯片引脚直接相连,而是通过锁存器SN74HC573ADWR连在一起的,芯片PD2口与锁存器LE使能端相连,PC8-PC15分别与LD1-LD8对应相连。
当锁存使能(LE)输入为高电平时,Q 输出响应数据(D)输入,锁存器处于透明模式,输出会随输入数据的变化而变化;当 LE 为低电平时,锁存器将存储 D 输入上的信息,输出保持不变,直到下一次 LE 变为高电平。
由电路图可知,LED阳极接高电平,阴极接芯片引脚。当芯片引脚置低电平时,LED两端构成通路,被点亮;当芯片引脚置高电平时,LED两端均为高电平,两端无法构成通路,LED熄灭。
二.STM32CubeMX中配置
Step1:从MCU创建工程
Step2:选择芯片型号STM32G431RBT6并开始工程
Step3:配置RCC
Step4:配置SYS
Step5:配置GPIO
Step6:配置时钟
Step7:配置工程
Step7:配置Code Generator,并生成项目
二.Keil配置
Step1
Step2
三.相关函数介绍
1.相关函数所在位置
2.常用函数介绍
·写电平函数
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
/**
* @brief 设置或清除选定的数据端口位。
*
* @note 此函数使用 GPIOx_BSRR 和 GPIOx_BRR 寄存器来实现原子的读/修改访问。
* 这样一来,在读取和修改访问之间就不会有中断请求(IRQ)发生的风险。
*
* @param GPIOx:其中 x 可以是 (A..G),用于为 STM32G4xx 系列选择 GPIO 外设。
* @param GPIO_Pin:指定要写入的端口位。
* 该参数可以是 GPIO_PIN_x 的任意组合,其中 x 可以是 (0..15)。
* @param PinState:指定要写入到选定端口位的值。
* 该参数可以是 GPIO_PinState 枚举类型的值之一:
* @arg GPIO_PIN_RESET:清除端口引脚
* @arg GPIO_PIN_SET:设置端口引脚
* @retval 无
*/
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
if (PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = (uint32_t)GPIO_Pin;
}
else
{
GPIOx->BRR = (uint32_t)GPIO_Pin;
}
}
使用示例:
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
//将GPIOC组的PIN8脚设置为低电平
·读电平函数
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/**
* @brief 读取指定的输入端口引脚。
* @param GPIOx:其中 x 可以是 (A..G),用于为 STM32G4xx 系列选择 GPIO 外设。
* @param GPIO_Pin:指定要读取的端口位。
* 该参数可以是 GPIO_PIN_x 的任意组合,其中 x 可以是 (0..15)。
* @retval 输入端口引脚的值。
*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
GPIO_PinState bitstatus;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != 0x00U)
{
bitstatus = GPIO_PIN_SET;
}
else
{
bitstatus = GPIO_PIN_RESET;
}
return bitstatus;
}
使用示例:
HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8);
//读取GPIOC组的PIN8引脚的电平状态
·反转电平函数
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/**
* @brief 翻转指定的 GPIO 引脚。
* @param GPIOx:其中 x 可以是 (A..G),用于为 STM32G4xx 系列选择 GPIO 外设。
* @param GPIO_Pin:指定要翻转的引脚。
* 该参数可以是 GPIO_PIN_x 的任意组合,其中 x 可以是 (0..15)。
* @retval 无
*/
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
uint32_t odr;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
/* get current Output Data Register value */
odr = GPIOx->ODR;
/* Set selected pins that were at low level, and reset ones that were high */
GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}
使用示例:
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11);
//反转GPIOC组PIN11的电平状态
四.代码实现
1.将GPIODPIN2引脚置高电平,使能锁存器(这样才能操作LED);
2.将GPIOCPIN8,9引脚置低电平,即点亮LED1,LED2;
2.使GPIOCPIN11闪烁。
...
...
...
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//将GPIODPIN2引脚置高电平,使能锁存器
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);//将GPIOCPIN8引脚置低电平,即点亮LED1
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);//将GPIOCPIN9引脚置低电平,即点亮LED2
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11);//将GPIOCPIN11引脚反转,即使GPIOCPIN11引脚闪烁
HAL_Delay(500);//延时函数,延时500ms
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
...
...
...
更多推荐
所有评论(0)