前言
软件版本:
STM32CubeMX:6.30
KEIl:5.31
FlyMcu:0.188
SSCOM: 5.13.1
硬件:
STM32F103C8T
①手动息亮LED
一、使用STM32cube配置项目
1、配置RCC
2、设置SYS
3、设置USART
4、设置NVIC
5、创建项目
二、在keli5中配置代码
1.打开生成的项目,找到stm32f1xx_it.c
2.找到EXTI9_5_IRQHandler这个函数,选中HAL_GPIO_EXTI_IRQHandler这个语句按F12跳到该函数
3.在项目中找到stm32f1xx_hal_gpio.c文件,找到HAL_GPIO_EXTI_Callback这个函数
在该函数中添加代码
#define LED_A4_Pin GPIO_PIN_4
#define LED_A4_GPIO_Port GPIOA
#define SWITCH_Pin GPIO_PIN_5
#define SWITCH_GPIO_Port GPIOB
#define SWITCH_EXTI_IRQn EXTI9_5_IRQn
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == SWITCH_Pin){
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
if(pinState==GPIO_PIN_RESET)
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_SET);
}
}
4.编译并且输出HEX文件,并将其烧录
三、效果
因为抖动的原因,当B5什么也不接入的时候,LED灯一直在频繁闪,看起来是亮的,但是不是很亮。
当B5接入高电平后LED明显变亮。
当B5接低电平后LED直接熄灭。
②HAL库中断方式进行串口通信
一、再次通过CubeMX配置项目
1.设置RCC
2.设置SYS
3.设置USART
4.设置NVIC
5.创建项目
二、keli5配置
1.打开项目
2.在main函数中设置接收中断
在main函数中添加代码
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>
void SystemClock_Config(void);
char c;
char message[]="hello Windows\n";
char tips[]="CommandError\n";
char tips1[]="Start.....\n";
char tips2[]="Stop......\n";
int flag=0;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
while (1)
{
if(flag==1){
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
HAL_Delay(1000);
}
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(c=='0'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF);
}
else if(c=='1'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF);
}
else {
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF);
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
3.编译并烧录
4. 使用T和S 进行开始和中断
总结:
此次实验,我了解了LED灯如何使用高低电平进行亮灭,如何进行串口通信。
|