STM32HAL库学习笔记

STM32HAL库学习笔记
GPIO单片机的每个IO口内部都有一个这个结构并有如下8种工作模式1、输出模式1推挽输出与开漏输出其核心在于以下电路我们可以将其等效为一个开关。推挽输出就是两个MOS管交替导通给上面电平就会输出什么电平有更强的驱动能力而开漏输出则是保持上面的MOS管断开此时给低电平输出就是低电平而给高电平由于无上拉成高阻抗需要在外部接上拉电阻才会输出高电平2通用模式和复用模式通用模式是直接控制IO口产生高低电平而复用就是将IO口交给芯片中的其他模块进行控制如UART,IIC,SPI等等2、输入模式如下图所示非常明显上拉模式就是接上拉电阻下拉模式就是接下拉电阻浮空就是两个都不接而模拟模式仅在输入模拟信号的时候用到一、中断方式接收不定长数据1、CubeMax配置由于需要定时器做超时判断可以如图进行设置以时钟源72MHz为例2、核心代码这里针对波特率为9600进行超时判断9600 bps 的字节传输时间约为 1.04 ms而 TIM1 的 100 kHz 计数频率意味着 1 ms ≈ 100 counts所以200的接收阈值较为合适。#defineSTRING_LENGTH20uint8_trxData,UART1[STRING_LENGTH];uint8_trec_flag0,Index0;charSend[STRING_LENGTH];voidUART1_Recive_Start(void){HAL_TIM_Base_Start(htim1);HAL_UART_Receive_IT(huart1,rxData,1);sprintf(Send,Hi\r\n);HAL_UART_Transmit(huart1,(uint8_t*)Send,strlen(Send),1000);}voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){if(huarthuart1){// Process the received data in rxData// For example, you can send it to a queue or set a flagrec_flag1;TIM1-CNT0;UART1[Index]rxData;Index;Index%STRING_LENGTH;// Restart the UART receive interrupt for the next byteHAL_UART_Receive_IT(huart1,rxData,1);}}voidUART_Clear(uint8_t*UART,uint8_t*index){uint8_ti;for(i0;iSTRING_LENGTH;i){UART[i]0;}*index0;}voidUART_Process(void){if(rec_flag1){if(TIM1-CNT200)//2ms{uint8_tlenIndex;HAL_UART_Transmit(huart1,UART1,len,1000);rec_flag0;UART_Clear(UART1,Index);}}}voidStartCommandTask(void*argument){UART1_Recive_Start();for(;;){UART_Process();osDelay(500);}}这是在FreeRTOS下通过定时器进行超时判断完成不定长数据的接收。DMA模式进行串口收发1、CubeMax配置仅需再DMA Setting 栏下加入TX和RX通道其他参数默认即可。代码部分也仅需将串口相关函数的_IT改成_DMA就行了这里不做过多赘述。