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 

 

posted @ 2020-07-13 10:51  XZHDJH  阅读(320)  评论(0)    收藏  举报