蓝桥杯物联网设计省赛备战第二天攻略
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函数中的代码所知,现象如下:
作者:在努力啦~