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

5.串口DMA的发送

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

(2)串口的配置

将PA2,PA3分别配置为USART_TX和USART_RX(此时他们为黄色状态代表配置了一半),在点击USART2mode选择Asynchronous(通用异步),波特率改为9600,再点击DMA点击add,选择USART2_TX,最后在NVIC中如图中内容配置即可

(3)keil代码的生成

Final.c

#include "Final.h"
#include "gpio.h"
#include "string.h"

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;
    }
}

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

void Final_Uart_Tx(unsigned char *final_uart_tx_data)
{
    extern UART_HandleTypeDef huart2;
  HAL_UART_Transmit_DMA(&huart2,final_uart_tx_data,strlen(final_uart_tx_data));
    
}

main.c

/* Includes ------------------------------------------------------------------*/

#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "Final.h"//此处为Final.c头文件,只能在BEGIN和END之间添加才不会被覆盖

unsigned char final_uart_tx_data[]="USART TEST \r\n";//全局变量

/* USER CODE END Includes */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
        unsigned char final_uart_tx_data1[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};
        unsigned char final_uart_tx_data2[]="\r\n USART1 TEST \r\n";
        Final_Uart_Tx(final_uart_tx_data2);
    /* USER CODE END WHILE */

(4)实验现象

打开串口,可以根据main函数中的代码所知,现象如下

6.RTC时钟

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

(2)RTC时钟的配置

点击RTC,在Mode中勾选Activate Clock Source和Activate Calendar,下面就对时钟和日历进行自我修改即可

(3)keil代码的生成

Final.c

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

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;
    }
}

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

void Final_Uart_Tx(unsigned char *final_uart_tx_data)
{
    extern UART_HandleTypeDef huart2;
  HAL_UART_Transmit_DMA(&huart2,final_uart_tx_data,strlen(final_uart_tx_data));
    
}

//名称:fputc
//作用:串口2以阻塞模式发送字符串数据
//参数:系统函数 无需关系
//返回值:无
//备注:尽量不要使用该串口函数

int fputc(int ch,FILE *f)//串口打印函数
{
    extern UART_HandleTypeDef huart2;//声明句柄
    HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,1000);//以阻塞模式发送数据
    return ch;
}
//名称:Final_RTC
//作用:读取RTC的年,月,星期,日,时,分,秒
//参数:无
//返回值:RTC的值
//备注:先读取Data,在读取Time,否则可能数据有误

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;
}

main.c

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "rtc.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "Final.h"
unsigned char final_uart_tx_data[]="USART TEST \r\n";
/* USER CODE END Includes */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
        unsigned char *final_uart_tx_data=Final_RTC();
        printf("\r\n RTC:%d-%d-%d \r\n %d:%d:%d \r\n",2000+final_uart_tx_data[0],
        final_uart_tx_data[1],final_uart_tx_data[3],final_uart_tx_data[4],
        final_uart_tx_data[5],final_uart_tx_data[6]);
        
        HAL_Delay(1000);
    /* USER CODE END WHILE */

(4)实验现象

打开串口,可以根据main函数中的代码所知,现象如下:

  • 43
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值