蓝桥杯物联网设计省/国赛准备第五天

10.TIM_定时器

(1)将时钟树配置为32MHz

(2)TIM的配置

将CubeMX中的定时器7激活即可生成代码

(3)keil代码的生成

Final.c

#include "Final.h"
#include "gpio.h"
#include "string.h"
#include "stdio.h" 
#include "oled.h"
#include "lora.h"

#define final_uart_rx_buffer_len  100
unsigned char final_uart_rx_len;
unsigned char final_uart_rx_end_flag;
unsigned char final_uart_rx_buffer[final_uart_rx_buffer_len];

extern UART_HandleTypeDef huart2;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern I2C_HandleTypeDef hi2c3;
extern SPI_HandleTypeDef hspi1;
extern TIM_HandleTypeDef htim7;

void Final_LD5(unsigned char state)
{
    switch(state)
    {
        case 0:
            HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_SET);
        break;
        case 1:
            HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET);
        break;
        case 2:
            HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
        break;
    }
}

void Final_Relay(unsigned char number,unsigned char state)
{
    switch(number)
    {
        case 1:
            switch(state)
            {
                case 0:
                    HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_RESET);
                break;
                case 1:
                    HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_SET);
                break;
                case 2:
                    HAL_GPIO_TogglePin(K1_GPIO_Port, K1_Pin);
                break;
            }
            break;
        case 2:
            switch(state)
            {
                case 0:
                HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_RESET);
                break;
                case 1:
                HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_SET);
                break;
                case 2:
                HAL_GPIO_TogglePin(K2_GPIO_Port, K2_Pin);
                break;
            }
            break;
    }
}

//unsigned char Final_Key(void)
//{
//    unsigned char value=0;
//    if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
//    {
//        HAL_Delay(20);
//        if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
//        {
//            value=1;
//            while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET);
//        }
//    }
//    return value;
//}

void HAL_GPIO_EXTI_Callback(unsigned short int GPIO_Pin)
{
    if(GPIO_Pin==KEY_Pin)
        Final_LD5(2);
    
}

void Final_UART_DMA_Tx(const unsigned char *final_uart_tx_data)
{
  HAL_UART_Transmit_DMA(&huart2,final_uart_tx_data,strlen(final_uart_tx_data));
    
}

int fputc(int ch,FILE *f)
{
    
    HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,1000);
    return ch;
}

void Final_USART_IDLE_RX(void)
{
    if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)==SET)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
        HAL_UART_DMAStop(&huart2);
        final_uart_rx_len=final_uart_rx_buffer_len-__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
        final_uart_rx_end_flag=1;
        
    }
}

void Final_USART_RX_Deal(void)
{
    if(final_uart_rx_end_flag)
    {
        HAL_UART_Transmit_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
        final_uart_rx_len=0;
        final_uart_rx_end_flag=0;
        HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
        
    }
}

unsigned char *Final_RTC(void)
{
    static unsigned char  rtc_value[7];
    extern RTC_HandleTypeDef hrtc;
    RTC_TimeTypeDef time_value;
    RTC_DateTypeDef date_value;
    
    HAL_RTC_GetTime(&hrtc,&time_value,RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc,&date_value,RTC_FORMAT_BIN);
    
    rtc_value[0]=date_value.Year;
    rtc_value[1]=date_value.Month;
    rtc_value[2]=date_value.WeekDay;
    rtc_value[3]=date_value.Date;
    
    rtc_value[4]=time_value.Hours;
    rtc_value[5]=time_value.Minutes;
    rtc_value[6]=time_value.Seconds;
    return rtc_value;
}

void OLED_Write(unsigned char addr,unsigned char data)
{
    unsigned char pdata[2];
    pdata[0]=addr;
    pdata[1]=data;
    HAL_I2C_Master_Transmit(&hi2c3,0x78,pdata,2,0xff);
}

void Final_OLED_Init(unsigned char ms)
{
    HAL_GPIO_WritePin(OLED_Power_GPIO_Port, OLED_Power_Pin, GPIO_PIN_RESET);
    HAL_Delay(ms);
    OLED_Init();
    OLED_Clear();
}

unsigned char SPI_WriteRead(unsigned char addr,unsigned char data)
{
    unsigned char Tx_Data[2];
    unsigned char Rx_Data[2];
    
    Tx_Data[0]=addr;
    Tx_Data[1]=data;
    HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_RESET);
    
    HAL_SPI_TransmitReceive(&hspi1,Tx_Data,Rx_Data,2,0xFF);
    
    HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_SET);
    
    return Rx_Data[1];
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static int count=0;
    if(htim->Instance==TIM7)
    {
        if(++count>1000)
        {
            count=0;
            printf("1sec\r\n");//通过串口打印定时器每秒完成的标准
        }
    }
}


void Final_Init()
{
    Final_LD5(0);
    Final_Relay(1,0);
    Final_Relay(2,0);
    
    Final_OLED_Init(100);
    LORA_Init();
    __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
    
    HAL_TIM_Base_Start_IT(&htim7);
    
}

(4)实验现象

11.STS30温湿度(扩展模块)

(1)将时钟树配置为32MHz

(2)CubeMx的配置

将PB6和PB7分别配置为I2C1_SCL和I2C1_SDA(此时引脚为黄色),将I2C1中的模式选为I2C即可生成代码

(3)keil代码的生成

Final.c

#include "Final.h"
#include "gpio.h"
#include "string.h"
#include "stdio.h" 
#include "oled.h"
#include "lora.h"

#define final_uart_rx_buffer_len  100
unsigned char final_uart_rx_len;
unsigned char final_uart_rx_end_flag;
unsigned char final_uart_rx_buffer[final_uart_rx_buffer_len];

extern UART_HandleTypeDef huart2;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern I2C_HandleTypeDef hi2c3;
extern SPI_HandleTypeDef hspi1;
extern TIM_HandleTypeDef htim7;
extern I2C_HandleTypeDef hi2c1;

void Final_LD5(unsigned char state)
{
    switch(state)
    {
        case 0:
            HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_SET);
        break;
        case 1:
            HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET);
        break;
        case 2:
            HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
        break;
    }
}

void Final_Relay(unsigned char number,unsigned char state)
{
    switch(number)
    {
        case 1:
            switch(state)
            {
                case 0:
                    HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_RESET);
                break;
                case 1:
                    HAL_GPIO_WritePin(K1_GPIO_Port, K1_Pin, GPIO_PIN_SET);
                break;
                case 2:
                    HAL_GPIO_TogglePin(K1_GPIO_Port, K1_Pin);
                break;
            }
            break;
        case 2:
            switch(state)
            {
                case 0:
                HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_RESET);
                break;
                case 1:
                HAL_GPIO_WritePin(K2_GPIO_Port, K2_Pin, GPIO_PIN_SET);
                break;
                case 2:
                HAL_GPIO_TogglePin(K2_GPIO_Port, K2_Pin);
                break;
            }
            break;
    }
}

//unsigned char Final_Key(void)
//{
//    unsigned char value=0;
//    if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
//    {
//        HAL_Delay(20);
//        if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET)
//        {
//            value=1;
//            while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET);
//        }
//    }
//    return value;
//}

void HAL_GPIO_EXTI_Callback(unsigned short int GPIO_Pin)
{
    if(GPIO_Pin==KEY_Pin)
        Final_LD5(2);
    
}

void Final_UART_DMA_Tx(const unsigned char *final_uart_tx_data)
{
  HAL_UART_Transmit_DMA(&huart2,final_uart_tx_data,strlen(final_uart_tx_data));
    
}

int fputc(int ch,FILE *f)
{
    
    HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,1000);
    return ch;
}

void Final_USART_IDLE_RX(void)
{
    if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)==SET)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
        HAL_UART_DMAStop(&huart2);
        final_uart_rx_len=final_uart_rx_buffer_len-__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
        final_uart_rx_end_flag=1;
        
    }
}

void Final_USART_RX_Deal(void)
{
    if(final_uart_rx_end_flag)
    {
        HAL_UART_Transmit_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
        final_uart_rx_len=0;
        final_uart_rx_end_flag=0;
        HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
        
    }
}

unsigned char *Final_RTC(void)
{
    static unsigned char  rtc_value[7];
    extern RTC_HandleTypeDef hrtc;
    RTC_TimeTypeDef time_value;
    RTC_DateTypeDef date_value;
    
    HAL_RTC_GetTime(&hrtc,&time_value,RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc,&date_value,RTC_FORMAT_BIN);
    
    rtc_value[0]=date_value.Year;
    rtc_value[1]=date_value.Month;
    rtc_value[2]=date_value.WeekDay;
    rtc_value[3]=date_value.Date;
    
    rtc_value[4]=time_value.Hours;
    rtc_value[5]=time_value.Minutes;
    rtc_value[6]=time_value.Seconds;
    return rtc_value;
}

void OLED_Write(unsigned char addr,unsigned char data)
{
    unsigned char pdata[2];
    pdata[0]=addr;
    pdata[1]=data;
    HAL_I2C_Master_Transmit(&hi2c3,0x78,pdata,2,0xff);
}

void Final_OLED_Init(unsigned char ms)
{
    HAL_GPIO_WritePin(OLED_Power_GPIO_Port, OLED_Power_Pin, GPIO_PIN_RESET);
    HAL_Delay(ms);
    OLED_Init();
    OLED_Clear();
}

unsigned char SPI_WriteRead(unsigned char addr,unsigned char data)
{
    unsigned char Tx_Data[2];
    unsigned char Rx_Data[2];
    
    Tx_Data[0]=addr;
    Tx_Data[1]=data;
    HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_RESET);
    
    HAL_SPI_TransmitReceive(&hspi1,Tx_Data,Rx_Data,2,0xFF);
    
    HAL_GPIO_WritePin(SPI_NSS_GPIO_Port, SPI_NSS_Pin, GPIO_PIN_SET);
    
    return Rx_Data[1];
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static int count=0;
    if(htim->Instance==TIM7)
    {
        if(++count>1000)
        {
            count=0;
            printf("1sec\r\n");
        }
    }
}
float Final_STS30(void)
{
    unsigned char data[2];
    
    data[0]=0x24;
    data[1]=0x0B;
    
    HAL_I2C_Master_Transmit(&hi2c1,0x4A<<1,data,2,10);
    
    HAL_Delay(10);
    
    HAL_I2C_Master_Receive(&hi2c1,(0x4A<<1)+1,data,2,10);
    
    return (float)(data[0]<<8|data[1])*175/65535-45;
}

void Final_Init()
{
    Final_LD5(0);
    Final_Relay(1,0);
    Final_Relay(2,0);
    
    Final_OLED_Init(100);
    LORA_Init();
    __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart2,final_uart_rx_buffer,final_uart_rx_buffer_len);
    
    HAL_TIM_Base_Start_IT(&htim7);
    
}

main.c

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "i2c.h"
#include "rtc.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"

#include "Final.h"
#include "oled.h"
#include "lora.h"

/* USER CODE END Includes */

 /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  MX_RTC_Init();
  MX_I2C3_Init();
  MX_SPI1_Init();
  MX_TIM7_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
    
  Final_Init();
    
    static unsigned char final_oled_buffer[16];
    float final_tepm_value[1];
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        final_tepm_value[0]=Final_STS30();
        sprintf((char *)final_oled_buffer,"Temp:%.2f",final_tepm_value[0]);
        OLED_ShowString(0,final_oled_buffer);
        
        printf("当前温度为:%.2f\r\n",Final_STS30());
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

(4)实验现象

 

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值