打开主菜单

谷雨文档中心 β

更改

NBDK-L4:基础实验教程

添加1,108字节2019年2月19日 (二) 10:48
无编辑摘要
在while()循环当中,持续获取当前的时钟、日期等相关信息,并且打印到TFT彩屏上显示。
当检测到闹钟信息,则在TFT彩屏上打印"Alarm"字样指示闹钟。字样指示闹钟,停止蜂鸣器工作,并且让闹钟标识置为0。
<syntaxhighlight lang="c++" line="1" start="44">
{
rtcAlarm = 0;
Buzzer_SET(GPIO_PIN_RESET); // 关闭蜂鸣器
GUI_DispStringAt("AlarmA",24,168); // 显示屏打印闹钟A标志
}
基础实验中的其他例程,大部分都是使用的相同的时钟配置函数,有特殊的时钟使用,将会在对应例程的源码详解中做针对性说明。
==== gyu_usartc gyu_rtc.c ====串口初始化函数,配置串口协议:波特率115200,数据位8位,停止位1位,无校验位,无流控制。RTC时钟初始化函数,我们配置为24小时模式,禁止RTC输出,并且初始化RTC时钟。
<syntaxhighlight lang="c++" line="1" start="3750">void MX_USART1_UART_InitMX_RTC_Init(void)
{
// 配置串口参数 huart1hrtc.Instance = USART1RTC; // UART寄存器基础地址,定义为USART1的 huart1.Init.BaudRate = 115200; // 串口波特率为115200 huart1.Init.WordLength = UART_WORDLENGTH_8B; 配置为RTC // 串口数据位为8位 huart1.Init.StopBits = UART_STOPBITS_1; // 串口停止位为1位 huart1hrtc.Init.Parity HourFormat = UART_PARITY_NONERTC_HOURFORMAT_24; // 串口无校验位 huart1.Init.Mode = UART_MODE_TX_RX; // 串口模式,TX和RX作用24小时模式 huart1hrtc.Init.HwFlowCtl AsynchPrediv = UART_HWCONTROL_NONE127; // 串口无流控制异步预分频器,固定127(0x7F) huart1hrtc.Init.OverSampling SynchPrediv = UART_OVERSAMPLING_16255; // 16位过采样同步预分频器,固定255(0xFF) huart1hrtc.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; // 1位过采样禁能 huart1.AdvancedInit.AdvFeatureInit OutPut = UART_ADVFEATURE_NO_INITRTC_OUTPUT_DISABLE; // 没有串口高级功能初始化禁止RTC输出
// 串口初始化初始化RTC时钟 if (HAL_UART_InitHAL_RTC_Init(&huart1hrtc) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__); }}</syntaxhighlight>RTC初始化函数,使能RTC时钟。<syntaxhighlight lang="c++" line="1" start="73">void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc){ if(hrtc->Instance==RTC) { __HAL_RCC_RTC_ENABLE(); / 如果初始化失败,进入错误处理任务/ 使能RTC时钟 }}</syntaxhighlight>设置RTC时钟的函数,用于设置当前的时间(分别设置时分秒)。<syntaxhighlight lang="c++" line="1" start="91">void RTC_TIME_Set(uint8_t hour, uint8_t min, uint8_t sec){ RTC_TimeTypeDef sTime; // RTC时间结构体 sTime.Hours = hour; // 时 sTime.Minutes = min; // 分 sTime.Seconds = sec; // 秒 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; // 不定义AM和PM,因为24小时模式 sTime.StoreOperation = RTC_STOREOPERATION_RESET; // // 设置时钟 if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { _Error_Handler(__FILE__, __LINE__);
}
 
}
</syntaxhighlight>配置串口硬件,使能GPIOA以及USART1的时钟,配置PA9和PA10为串口的TX及RX引脚。设置RTC日期、星期的函数,用于设置当前的年月日、以及星期。<syntaxhighlight lang="c++" line="1" start="67119">void HAL_UART_MspInitRTC_DATE_Set(UART_HandleTypeDef* uartHandleuint8_t week, uint8_t year, uint8_t monty, uint8_t date)
{
RTC_DateTypeDef sDate; // RTC日期结构体 sDate.WeekDay = week; // 定义GPIO结构体星期 GPIO_InitTypeDef GPIO_InitStructsDate.Year = year; // 年 sDate.Month = monty; // 月 sDate.Date = date; // 日
// 判断选择的是否为USART1设置日期 if(uartHandle->Instance=HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) !=USART1HAL_OK)
{
_Error_Handler(__FILE__, __LINE__); }}<// 使能GPIOA引脚时钟(因为选择的TX和RX分别为PA9和PA10)syntaxhighlight>闹钟时间设置的函数,用于设置闹钟触发的时分秒。<syntaxhighlight lang="c++" line="1" start="147"> __HAL_RCC_GPIOA_CLK_ENABLEvoid RTC_AlarmA_Set(uint8_t hour, uint8_t min, uint8_t sec, uint8_t week){ RTC_AlarmTypeDef sAlarm; // RTC闹钟A结构体 sAlarm.AlarmTime.Hours = hour; // 时 sAlarm.AlarmTime.Minutes = min; // 分 sAlarm.AlarmTime.Seconds = sec; // 使能USART1时钟 sAlarm.AlarmTime.SubSeconds = 0; // 亚秒(这边没有作比较,任意设置) sAlarm.AlarmMask = RTC_ALARMMASK_NONE; // 精确到时分秒、日期或者星期 sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; // 亚秒不作比较 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; // 比较星期(设置星期或者日期) sAlarm.AlarmDateWeekDay = week; __HAL_RCC_USART1_CLK_ENABLE()// 星期 sAlarm.Alarm = RTC_ALARM_A; // 闹钟A
// GPIO配置开启闹钟中断 GPIO_InitStruct.Pin if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != GPIO_PIN_9|GPIO_PIN_10; // 选择USART1的TX和RX引脚(TX:PA9,RX:PA10) GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;// 引脚频率5-80MHzHAL_OK) GPIO_InitStruct.Alternate = GPIO_AF7_USART1; // 配置为USART1 { HAL_GPIO_Init_Error_Handler(GPIOA__FILE__, &GPIO_InitStruct__LINE__); // 初始化引脚
}
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 10, 0); // 抢占优先级10,子优先级0
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); // 使能中断
}
</syntaxhighlight>配置fputc()函数,用于格式化打印,当我们进行了如下代码配置,就可以调用printf()函数去格式化打印调试信息。闹钟回调函数,当RTC实时时钟计时到达设置的闹钟时间,就会触发此回调,我们在回调中打开蜂鸣器,并且置位闹钟的标识。<syntaxhighlight lang="c++" line="1" start="99181">#define PUTCHAR_PROTOTYPE int fputcvoid HAL_RTC_AlarmAEventCallback(int ch, FILE RTC_HandleTypeDef *fhrtcPUTCHAR_PROTOTYPE
{
Buzzer_SET(GPIO_PIN_SET); // 配置格式化输出到串口USART1蜂鸣器哔一声 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, rtcAlarm = 1, 0xFFFF); return ch;
}
 
</syntaxhighlight>
 
[[分类:NB-IOT]]
[[分类:NBDK-L4]]
[[分类:教程]]
__强显目录__
510
个编辑