实现以下内容,以及使用stm32cubemx的具体步骤: 1、stm32f103cbtx单片机串口发送时间到计算机,格式hh:mm:ss,每秒钟发一次; 2、计算发送SET_TIME hh:mm:ss到单片机,修改单片机时间。
时间: 2024-02-08 20:03:11 浏览: 111
能用串口修改时间的时钟程序,用串口调试助手工具调试.电路大家看程序就知道了,用S8952的单片机.zip
以下是使用STM32CubeMX实现上述内容的具体步骤:
1. 打开STM32CubeMX软件,选择对应的单片机型号,创建新工程。
2. 在Pinout & Configuration选项卡中,配置USART1的引脚。选择GPIOA的Pin9和Pin10作为USART1的Tx和Rx引脚。
3. 在Configuration选项卡中,配置USART1的参数。选择USART1,将Baud Rate设置为9600,数据位设置为8位,无奇偶校验,停止位设置为1位。
4. 在Project Manager选项卡中,选择生成代码。
5. 在生成的代码中,使用HAL库的函数实现串口通信和RTC时间的设置。
具体代码如下:
```c
#include "main.h"
#include <stdio.h>
#include <string.h>
RTC_HandleTypeDef hrtc;
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_RTC_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_RTC_Init();
RTC_TimeTypeDef RTC_TimeStructure;
char buffer[9];
while (1) {
// 获取当前时间
HAL_RTC_GetTime(&hrtc, &RTC_TimeStructure, RTC_FORMAT_BIN);
// 将时间格式化为hh:mm:ss
sprintf(buffer, "%02d:%02d:%02d", RTC_TimeStructure.Hours,
RTC_TimeStructure.Minutes, RTC_TimeStructure.Seconds);
// 发送时间到计算机
for (int i = 0; i < strlen(buffer); i++) {
HAL_UART_Transmit(&huart1, (uint8_t *)&buffer[i], 1, HAL_MAX_DELAY);
}
// 每秒钟发送一次
HAL_Delay(1000);
}
}
static void MX_RTC_Init(void) {
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
RTC_InitTypeDef RTC_InitStruct = {0};
// 使能RTC时钟
__HAL_RCC_RTC_ENABLE();
// 配置RTC时钟源
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
// 初始化RTC
RTC_InitStruct.HourFormat = RTC_HOURFORMAT_24;
RTC_InitStruct.AsynchPrediv = 127;
RTC_InitStruct.SynchPrediv = 255;
HAL_RTC_Init(&hrtc);
// 设置RTC时间
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
}
static void MX_USART1_UART_Init(void) {
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
}
static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOA时钟和USART1时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
// 配置USART1 Tx引脚为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置USART1 Rx引脚为浮空输入
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Error_Handler(void) {
__disable_irq();
while (1) {
}
}
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 |
RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
Error_Handler();
}
}
```
6. 在程序中添加接收并修改时间的功能。
具体代码如下:
```c
uint8_t time_buf[8];
while (1) {
// 等待接收到SET_TIME指令
uint8_t rx_data;
while (1) {
HAL_UART_Receive(&huart1, &rx_data, 1, HAL_MAX_DELAY);
if (rx_data == 'S') {
HAL_UART_Receive(&huart1, &rx_data, 1, HAL_MAX_DELAY);
if (rx_data == 'E') {
HAL_UART_Receive(&huart1, &rx_data, 1, HAL_MAX_DELAY);
if (rx_data == 'T') {
HAL_UART_Receive(&huart1, &rx_data, 1, HAL_MAX_DELAY);
if (rx_data == '_') {
// 读取时间
for (int i = 0; i < 8; i++) {
HAL_UART_Receive(&huart1, &time_buf[i], 1, HAL_MAX_DELAY);
}
// 将时间解析为RTC时间结构体
RTC_TimeTypeDef RTC_TimeStructure;
RTC_TimeStructure.Hours =
((time_buf[0] - '0') * 10) + (time_buf[1] - '0');
RTC_TimeStructure.Minutes =
((time_buf[3] - '0') * 10) + (time_buf[4] - '0');
RTC_TimeStructure.Seconds =
((time_buf[6] - '0') * 10) + (time_buf[7] - '0');
// 设置RTC时间
HAL_RTC_SetTime(&hrtc, &RTC_TimeStructure, RTC_FORMAT_BIN);
break;
}
}
}
}
}
}
```
在程序中使用HAL_UART_Receive()函数实现接收数据,使用HAL_RTC_SetTime()函数实现修改时间。
阅读全文