1. cubemx
时钟源选择,如图
调试sw接口设置,选择Serial Wire
串口选择usart1,默认A9,A10;选择中断接受模式,其他参数默认
选择GPIO模式,输出模式,控制灯
选择时钟,设置最高时钟为72MHz
设置输出文件,文件命名
2. 串口部分
需要开启串口通讯使能,否者不能进行通讯。
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
为方便调试,查看调试调试结果,通过增加下面函数到usart文件,实现重定向printf;
/* USER CODE BEGIN 0 */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__*/
/******************************************************************
*@brief Retargets the C library printf function to the USART.
*@param None
*@retval None
******************************************************************/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xFFFF);
return ch;
}
/* USER CODE END 0 */
3. 中断部分
extern uint8_t LED_Flag;//ÒýÓÃmianº¯ÊýÎļþµÄ±äÁ¿
extern uint8_t LED_Time_Sum;
uint8_t buf[9]; //´æ·ÅÊý¾ÝÊý×鶨Òå
uint8_t buf_size = 0;
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
uint8_t Res;
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE ) != RESET)//ÅжÏRXÊÇ·ñÓÐÊý¾Ý½ÓÈë
{
Res = ( uint16_t)READ_REG(huart1.Instance->DR);//½ÓÊÜ8λһ֡Êý¾Ý
// WRITE_REG(huart1.Instance->DR,Res); //°Ñ½ÓÊÕµÄÊý¾Ý·¢Ë͸øÖ÷»ú
buf[buf_size++] = Res;
if(buf_size == 9){//µ±Êý¾Ý´«ÊäÍê³É£¬ÕâÀïΪ9¸ö×Ö½ÚÊý¾Ý
if(buf[0] == 0x3A && buf[1] == 0x16 && buf[2] == 0x01 && buf[3] == 0x01){//ÅжÏÖ¡Í·
if(buf[7] == 0x0D && buf[8] == 0x0A){//ÅжÏ֡β
if(buf[1] + buf[2] + buf[3] + buf[4] == buf[5]){//УÑé,
LED_Flag = buf[4];//¿ØÖÆLEDµÆÐźÅ
LED_Time_Sum = 0;//ͬÓÚÑÓʱÅжÏ
if(LED_Flag == 0x04){//LED3ÁÁ£¬ÆäËûLEDÃð
HAL_GPIO_WritePin(GPIOC, LED3_Pin, GPIO_PIN_SET);
}
}
}
}
buf_size = 0;
}
}
/* USER CODE END USART1_IRQn 1 */
}
4. 主函数部分
先在主函数main外定义以下变量,然后通过it中断函数外部引入该变量;
uint8_t LED_Flag = 0;//¶¨Òåflag
uint8_t LED_Time_Sum = 0;
主函数while内,添加以下函数,实比较精准的延时;
if(LED_Flag != 0)//ÅжÏÊÇ·ñÓеÆÁÁÐźÅ
{
HAL_Delay(1000);//ÑÓʱ1s
LED_Time_Sum++;
// printf("%c", LED_Time_Sum);
if(LED_Time_Sum >= 10)//ÑÓʱ10s
{
LED_Flag = 0;
HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin, GPIO_PIN_RESET); //¹ØµÆ
}
}