本文例子参考《STM32单片机开发实例——基于Proteus虚拟仿真与HAL/LL库》
源代码:https://github.com/LanLinnet/STM32F103R6
单片机每隔1s以“YYYY-MM-DD HH:MM:SS”的格式自动向串口输出日期和时间信息(“ASCII格式”),起始时间设为“2022-05-20 05:20:00”,自动走时。按下按钮BTN,时间自动恢复为起始时间。串口通信参数:波特率为19200bit/s,无校验。
在第一节的基础上,在Proteus中添加电路如下图所示。

调试过程也可以添加一个虚拟仪器VIRTUAL TERMINAL,配置如下,用来查看单片机收到的串口数据,具体参考第11节。

RTC简介:
1)RTC是Real Time Clock(实时时钟)的首字母缩写形式,是一种常用的电子功能模块,有独立的RTC芯片,也有集成于单片机内的独立功能模块,常用于制作电子钟、电子表、电子万年历等计时工具。
2)STM32单片机的RTC可以看作特殊的定时器,它可以根据输入的时钟源自动计时,此外还提供了1个“闹钟”中断源和1个“秒”中断源。
打开CubeMX,建立工程。
首先,设置PA5为GPIO_EXTI5,点击“Categories”中的“GPIO”,将"GPIO mode"设置为External Interrupt Mode With Falling edge trigger detection,也就是下降沿触发。

随后,点击“Timers”列表中的“RTC”进行实时时钟配置。选中“Active Clock Source”和“Active Calendar”复选框,激活时钟源和日历。在“Parameter Settings”中设置时间和日期如下图所示。其中,“Data Format”设置数据格式有2个选项:“Binary Data Format”(字面意思是二进制数据格式,实际是十进制数据格式)和“BCD Data Format”(BCD码数据格式),实际设定时间时任意选其中一个即可。

然后,点击“Connectivity”列表中的“USART”进行串口配置。将Mode设置为Asynchronous(异步),波特率设为19200Bits/s,字长设为8Bits,校验设为None,停止位设为1,数据传送设为Receive and Transmit(接收与发送)。设置完成后,会看到右侧的PA9和PA10引脚被自动设置为USART1_TX和USART1_RX,即USART1的发送端和接收端。

再点击“NVIC Settings”,选中USART global interrupt和EXTI line[9:5] interrupts,使能Enabled串口1的中断功能和GPIO的外部中断。

最后,实践中为了追求时间的精度,我们会采用外部低速晶振LSE作为RTC的时钟源,由于本次采用Proteus进行仿真,我们选择默认的LSI作为RTC的时钟源。

点击“Generator Code”生成Keil工程。
本次我们需要实现实时时钟自动走时,并通过串口发送输出,需要用到RTC相关函数其API文档如下:
HAL_RTC_GetTime RTC时间获取函数

HAL_RTC_GetDate RTC日期获取函数

HAL_RTC_SetTime RTC时间设定函数

HAL_RTC_SetDate RTC日期设定函数

其中,介绍两个结构体:
时间结构体sTime有以下3个元素
日期结构体sDate有以下4个元素
另外,Format有以下2个宏定义选项
点击“Open Project”在Keil中打开工程,双击“main.c”文件。
首先我们需要在main.c文件中的最前面引入标准输入输出头文件
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
在main函数中定义日期结构体和时间结构体
/* USER CODE BEGIN 1 */
//定义日期结构体和时间结构体
RTC_DateTypeDef sDateStructure;
RTC_TimeTypeDef sTimeStructure;
char sYear[5];
char sMonth[3];
char sDate[3];
char sHour[3];
char sMin[3];
char sSec[3];
/* USER CODE END 1 */
随后,在/* USER CODE BEGIN 4 */和/* USER CODE END 4 */中插入外部中断回调函数,代码如下
/* USER CODE BEGIN 4 */
//外部中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//定义日期结构体和时间结构体
RTC_DateTypeDef sDateStructure;
RTC_TimeTypeDef sTimeStructure;
if(GPIO_Pin == GPIO_PIN_5) //检测到EXTI5线产生外部中断事件
{
//设置日期
sDateStructure.Year = 22;
sDateStructure.Month = 5;
sDateStructure.Date = 20;
sDateStructure.WeekDay = 5;
//十进制格式
HAL_RTC_SetDate(&hrtc, &sDateStructure, RTC_FORMAT_BIN);
//设置时间
sTimeStructure.Hours = 0x05;
sTimeStructure.Minutes = 0x20;
sTimeStructure.Seconds = 0;
//BCD码格格式
HAL_RTC_SetTime(&hrtc, &sTimeStructure, RTC_FORMAT_BCD);
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET); //直到按键松开
}
}
/* USER CODE END 4 */
最后,在while(1)中插入代码如下,进行RTC和串口发送相关操作
/* USER CODE BEGIN WHILE */
while (1)
{
//十进制格式
HAL_RTC_GetTime(&hrtc, &sTimeStructure, RTC_FORMAT_BIN); //RTC时间获取函数
//BCD码格式
HAL_RTC_GetDate(&hrtc, &sDateStructure, RTC_FORMAT_BCD); //RTC日期获取函数
//格式转换为字符串
sprintf(sYear, "%04x", 0x2000+sDateStructure.Year);
sprintf(sMonth, "%02x", sDateStructure.Month);
sprintf(sDate, "%02x", sDateStructure.Date);
sprintf(sHour, "%02d", sTimeStructure.Hours);
sprintf(sMin, "%02d", sTimeStructure.Minutes);
sprintf(sSec, "%02d", sTimeStructure.Seconds);
//打印日期
HAL_UART_Transmit(&huart1, (uint8_t *)sYear, 4, 4);
HAL_UART_Transmit(&huart1, (uint8_t *)&"-", 1, 1);
HAL_UART_Transmit(&huart1, (uint8_t *)sMonth, 2, 2);
HAL_UART_Transmit(&huart1, (uint8_t *)&"-", 1, 1);
HAL_UART_Transmit(&huart1, (uint8_t *)sDate, 2, 2);
HAL_UART_Transmit(&huart1, (uint8_t *)&" ", 1, 2);
//打印时间
HAL_UART_Transmit(&huart1, (uint8_t *)sHour, 2, 2);
HAL_UART_Transmit(&huart1, (uint8_t *)&":", 1, 1);
HAL_UART_Transmit(&huart1, (uint8_t *)sMin, 2, 2);
HAL_UART_Transmit(&huart1, (uint8_t *)&":", 1, 1);
HAL_UART_Transmit(&huart1, (uint8_t *)sSec, 2, 2);
HAL_UART_Transmit(&huart1, (uint8_t *)&"\n\r", 2, 2);
//延时
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack
我使用RVM安装Ruby-2.1.5并再次运行bundle。现在pggem不会安装,我得到这个错误:geminstallpg-v'0.17.1'----with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_configBuildingnativeextensionswith:'--with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config'Thiscouldtakeawhile...ERROR:Error
安装Rails时,一切都很好,但后来,我写道:rails-v和输出:/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`require':cannotloadsuchfile--rails/cli(LoadError)from/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`r
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接
运行bundle安装时,我收到以下消息:Rubygems2.0.14isnotthreadsafe,soyourgemswillbeinstalledoneatatime.UpgradetoRubygems2.1.0orhighertoenableparallelgeminstallation.这很奇怪,因为在我的RubyGems环境中它说我的RubyGems版本是:2.4.5.1(见下文)~/w/Rafftopia❯❯❯gemenvRubyGemsEnvironment:-RUBYGEMSVERSION:2.4.5.1-RUBYVERSION:2.2.5(2016-04-26patc
这是什么。我首先做了:rvmgetstablervminstallruby-2.2.2没有交易。它向我展示了以下内容:$rvminstallruby-2.2.2Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:ubuntu/14.04/i386/ruby-2.2.2.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Checkingrequirementsforubunt