STM32CubeMX 代码笔记 (持续更新)
1.定时器
必须自己打开中断
HAL_TIM_Base_Start_IT(&htim1);
重写中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if( htim -> Instance == htim1.Instance ) { a++; } else if( htim -> Instance == htim3.Instance ) { b++; } }
2.串口
这里有3种方式
(1). 阻塞 超时
HAL_UART_Transmit(&huart1,t_uart_buf,6,100);
(2). 中断 不阻塞
HAL_UART_Transmit_IT(&huart1,t_uart_buf,6);
(3). DMA 不阻塞
HAL_UART_Transmit_DMA(&huart1,t_uart_buf,6);
初始化的时候必须加这句
HAL_UART_Receive_IT(&huart1,&RxByte, 1); /* 收到1个就进中断 */
通常用中断方式,或者DMA其实也行 记得配置一下中断和DMA 注意这里最好循环多次保存数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { UNUSED(huart); if ( huart == &huart1 ) { RxBuff[Rx_Count++]=RxByte; if ( RxByte == 0x0A ) { while ( HAL_UART_Transmit_DMA ( &huart1 , RxBuff , Rx_Count ) == HAL_OK ) ;//或者HAL_UART_Transmit_IT Rx_Count = 0; } if ( Rx_Count>=254 ) { Rx_Count=0; } while ( HAL_UART_Receive_DMA(&huart1,&RxByte,1 ) == HAL_OK ) ; } }
重写printf
参考大佬:https://blog.csdn.net/shawn_shao/article/details/86491885
#include "stdio.h" #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF); return ch; }
3.IIC
这里我用来测试 OLED 这里 adapter 一下 写命令和写数据。注意这里要加上 while...或者说先去做其他事情,等这里完成了再搞下一步。因为非阻塞,会导致时许有问题
void OLED_WR_Byte(uint8_t dat,uint8_t cmd) { if(cmd==0) while(HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&dat,1,0x100)!= HAL_OK ); else while(HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&dat,1,0x100)!= HAL_OK ); }
4.RTC
参考:
https://blog.csdn.net/qq_35875017/article/details/82595045
1 /* 2 *Rtc时间设置 3 */ 4 void rtc_Set(struct rtcStdType Rtcval) 5 { 6 RTC_DateTypeDef stdatestructure; 7 RTC_TimeTypeDef sttimestructure; 8 s_Rtc = Rtcval; 9 10 //下面三行需要加上 11 stdatestructure.WeekDay = 0x01; 12 sttimestructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; 13 sttimestructure.StoreOperation = RTC_STOREOPERATION_RESET; 14 //上面三行需要加上 15 16 stdatestructure.Year = Rtcval.year ; 17 stdatestructure.Month = Rtcval.month ; 18 stdatestructure.Date = Rtcval.day ; 19 sttimestructure.Hours = Rtcval.hour ; 20 sttimestructure.Minutes = Rtcval.minute ; 21 sttimestructure.Seconds = Rtcval.second ; 22 23 24 HAL_RTC_SetTime(&hrtc, &sttimestructure, RTC_FORMAT_BIN); 25 HAL_RTC_SetDate(&hrtc, &stdatestructure, RTC_FORMAT_BIN); 26 27 }
我这里测试了,只测试了读取,没测试设置 下面的uart用dma发送,必定会HAL_OK的,所以必须要先delay一下下。。。。。。不然发送之前就改了buf,相当于连续发送2次第二个数据了。
RTC_DateTypeDef rtc_data ; RTC_TimeTypeDef rtc_time ; HAL_RTC_GetTime(&hrtc,&rtc_time,RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &rtc_data, RTC_FORMAT_BIN); memset( uart_data, 0, sizeof( uart_data ) ); sprintf(uart_data,"\r\n 20%02d-%02d-%02d \r\n",rtc_data.Year,rtc_data.Month,rtc_data.Date); while ( HAL_UART_Transmit_DMA(&huart1,uart_data,strlen(uart_data)) != HAL_OK ); vTaskDelay( 100/portTICK_PERIOD_MS ); memset( uart_data, 0, sizeof( uart_data ) ); sprintf(uart_data,"\r\n %02d:%02d:%02d \r\n",rtc_time.Hours,rtc_time.Minutes,rtc_time.Seconds); while ( HAL_UART_Transmit_DMA(&huart1,uart_data,strlen(uart_data)) != HAL_OK );
LOG:
2000-01-01 00:05:39 2000-01-01 00:05:41 2000-01-01 00:05:43 2000-01-01 00:05:45 2000-01-01 00:05:47 2000-01-01 00:05:48

浙公网安备 33010602011771号