你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCLEO-F413ZH开发板评测--12232液晶+RTC,会持续更新

[复制链接]
wofei1314 提问时间:2016-12-28 12:51 /
本帖最后由 wofei1314 于 2016-12-28 13:06 编辑

由于最近工作比较忙,照片后期再补发
使用Cube创建MDK工程模板,12232带字库液晶
主要实现功能:
1、显示“STM32 社区欢迎你”
2、实时显示RTC信息
3、串口打印系统运行时间

照片有时间补发,内附CubeMX工程
直接上程序 Test01_LCD12232.rar (8.09 MB, 下载次数: 197)

评分

参与人数 1 ST金币 +20 收起 理由
zero99 + 20

查看全部评分

收藏 4 评论14 发布时间:2016-12-28 12:51

举报

14个回答
wofei1314 回答时间:2016-12-28 12:53:12
本帖最后由 wofei1314 于 2017-1-1 10:12 编辑

第一步,使用Cube配置
首先打开CubeMx,选择STM32F413这款芯片,过程太过简单,略过。。。接下来选择串口的配置,以方便后面打印一些调试信息到串口,上位机可以实时了解运行过程,如下图所示。。 串口配置.png
由于Nucleo板的usart3连接的是板载的STLink的虚拟串口,所以按照上图选择,然后配置选择启用RTC时钟
RTC配置.png
RTC配置基本上只需要上面打个勾就行了,然后来到系统晶体配置
时钟配置.png
我使用的是LSI和HSI,内部的RC时钟,主频最高,跑100M
然后到具体的串口配置,也非常简单,基本上都是点一点鼠标就能完成。。。
串口配置1.png 串口配置2.png
配置好波特率,接着设置一下CubeMX的工程路径等相关参数
CubeMX工程配置.png CubeMX工程配置1.png
然后就可以生成初始化代码了
生成代码.png
然后就有了初始化代码的文件夹,我们找到MDK工程的并打开就行了(其它的IDE只有上面倒数第二图的IDE环境出选择不一样,其它的基本都是一样的)
第二步,修改代码
a,串口相关的代码的修改,为了使用printf函数,参考坛子内网友的做法,点我查看,以下是我的代码,使用串口3,一次发送一个字节
  1. /* USER CODE BEGIN 4 */
  2. int fputc(int ch,FILE *f)//重新定义fputc函数使其输出到串口上
  3. {
  4.     HAL_UART_Transmit(&huart3,(uint8_t *)&ch,1,5);
  5.     return ch;
  6. }
  7. /* USER CODE END 4 */
复制代码
然后头文件包含  #include "string.h"
就可以使用printf函数来通过串口打印信息。。。
b、RTC程序的修改
RTC的程序参考HAL库里边的例程修改的,需要用到的朋友,可以详细参阅HAL库的官方例程本程序主要用到了两个函数,一个设置时间日期的,一个用于获取时间日期的,设置时间日期的函数如下:
  1. /**
  2.   * @brief  Configure the current time and date.
  3.   * @param  六字节,年月日时分秒,再加一个上午还是下午
  4.   * @retval None
  5.   */
  6. void RTC_CalendarCalibration(uint8_t *cal,uint8_t isAM)
  7. {
  8.     RTC_DateTypeDef sdatestructure;
  9.     RTC_TimeTypeDef stimestructure;

  10.     /*##-1- Configure the Date #################################################*/
  11.     /* Set Date: Tuesday April 14th 2015 */
  12.     sdatestructure.Year = *cal++;//0x15;//15年
  13.     sdatestructure.Month = *cal++;//RTC_MONTH_APRIL;
  14.     sdatestructure.Date = *cal++;//0x14;
  15.     sdatestructure.WeekDay = RTC_WEEKDAY_TUESDAY;

  16.     if(HAL_RTC_SetDate(&hrtc,&sdatestructure,RTC_FORMAT_BIN) != HAL_OK)
  17.         //if(HAL_RTC_SetDate(&hrtc,&sdatestructure,RTC_FORMAT_BCD) != HAL_OK)
  18.     {
  19.         /* Initialization Error */
  20.         Error_Handler();
  21.     }

  22.     /*##-2- Configure the Time #################################################*/
  23.     /* Set Time: 02:00:00 */
  24.     stimestructure.Hours = *cal++;//0x02;
  25.     stimestructure.Minutes = *cal++;//0x00;
  26.     stimestructure.Seconds = *cal;//0x00;
  27.     if(isAM)
  28.         stimestructure.TimeFormat = RTC_HOURFORMAT12_AM;
  29.     else
  30.         stimestructure.TimeFormat = RTC_HOURFORMAT12_PM;
  31.     stimestructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  32.     stimestructure.StoreOperation = RTC_STOREOPERATION_RESET;

  33.     if(HAL_RTC_SetTime(&hrtc,&stimestructure,RTC_FORMAT_BIN) != HAL_OK)
  34.         //if(HAL_RTC_SetTime(&hrtc,&stimestructure,RTC_FORMAT_BCD) != HAL_OK)
  35.     {
  36.         /* Initialization Error */
  37.         Error_Handler();
  38.     }

  39.     /*##-3- Writes a data in a RTC Backup data Register1 #######################*/
  40.     HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F2);
  41. }
复制代码
获取时间日期的函数如下:
  1. /****
  2.         *        获取时间,六个字节,年月日时分秒
  3.         *
  4.         */
  5. void RTC_CalendarGet(uint8_t *dt)
  6. {
  7.     RTC_DateTypeDef sdatestructureget;
  8.     RTC_TimeTypeDef stimestructureget;

  9.     /* Get the RTC current Time */
  10.     HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  11.     /* Get the RTC current Date */
  12.     HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);

  13.     *dt++ = sdatestructureget.Year;
  14.     *dt++ = sdatestructureget.Month;
  15.     *dt++ = sdatestructureget.Date;

  16.     *dt++ = stimestructureget.Hours;
  17.     *dt++ = stimestructureget.Minutes;
  18.     *dt   = stimestructureget.Seconds;
  19. }
复制代码
c、定时器的配置,本程序中使用了TIM14来定时,每ms计时变量+1,用来指示系统已经运行多少时间,定时器的初始化程序如下:
  1. /* TIM14 init function */
  2. static void MX_TIM14_Init(void)
  3. {

  4.     htim14.Instance = TIM14;
  5.     htim14.Init.Prescaler = 100;
  6.     htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
  7.     htim14.Init.Period = 1000;
  8.     htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  9.     if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
  10.     {
  11.         Error_Handler();
  12.     }

  13. }
复制代码
定时器的中断函数我是这样写的
  1. /**
  2. * @brief This function handles TIM8 trigger and commutation interrupts and TIM14 global interrupt.
  3. */
  4. void TIM8_TRG_COM_TIM14_IRQHandler(void)
  5. {
  6.     /* USER CODE BEGIN TIM8_TRG_COM_TIM14_IRQn 0 */
  7.     static uint16_t ledTimes=0;
  8.     /* USER CODE END TIM8_TRG_COM_TIM14_IRQn 0 */
  9.     HAL_TIM_IRQHandler(&htim14);
  10.     /* USER CODE BEGIN TIM8_TRG_COM_TIM14_IRQn 1 */
  11.     if(++ledTimes >= 300)
  12.     {
  13.         ledTimes = 0;
  14.         HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
  15.     }

  16.     ++runTime;//运行的ms数
  17.     /* USER CODE END TIM8_TRG_COM_TIM14_IRQn 1 */
  18. }
复制代码
d、主程序的编写,主程序中除了系统生成的初始化代码外,我们自己需要写一些代码去使能外设函数,例如启动串口中断接收、启动CAN接收等,本程序未使用到,所以不会提及,本程序中只需要在while循环前使能定时中断即可,增加如下代码
  1. /* USER CODE BEGIN 2 */
  2.     HAL_TIM_Base_Start_IT(&htim14);
  3.     /* USER CODE END 2 */
复制代码
这样就可以启动定时器了。。。

然后while循环中使用以下函数就能实时打印了,有辣么一丢丢的像Linux中的日志打印
  1. printf("[%06d.%03d s] \r\n",runTime/1000,runTime%1000);
复制代码

另外在while循环前增加一句读RTC寄存器的代码,以判断是否是断电后的第一次使用,第一次使用的时候需要校准,另外可以根据实际使用情况,随时校准RTC(这个校准是软件校时,不是校准RTC的晶振。。。)
  1. //RTC判断
  2.     if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F2)
  3.     {
  4.         /* Configure RTC Calendar */
  5.         RTC_CalendarConfig();
  6.     }
复制代码


然后在while循环前初始化液晶显示模块,
  1. LCD12232_Init();
  2.     ClearScreen();
复制代码
定义显示液晶显示内容
  1. char *gs1= {"STM32 社区欢迎你"};
复制代码
但是就是调用液晶显示函数了,while循环函数如下:
  1. while (1)
  2.     {
  3.         /* USER CODE END WHILE */

  4.         /* USER CODE BEGIN 3 */
  5.         printf("[%06d.%03d s] \r\n",runTime/1000,runTime%1000);
  6.         HAL_Delay(500);
  7.         //sprintf((char *)buf,"[%06d.%03d s]",runTime/1000,runTime%1000);
  8.         //DispHZ(0,0,(char *)buf,0);
  9.                 RTC_CalendarShow(buf,(buf+20));
  10.                 DispHZ(3,1,(char *)buf,0);
  11.                 RTC_CalendarShow(buf,(buf+20));
  12.                 DispHZ(0,0,(char *)(buf+20),0);
  13.     }
  14.     /* USER CODE END 3 */
复制代码
因为现在在老家,板子不方便随身携带,所以照片只能稍后再补喽。。。见谅~

STM32社区是个好地方,好多大神在,交流很方便,小弟才疏学浅,只希望能带给初学者以及有需要的人那么一丢丢的帮助也就心满意足了,不喜勿喷~
黑皮男 回答时间:2016-12-28 13:00:44
帮顶一下
wofei1314 回答时间:2016-12-28 13:05:00

谢谢~时间太仓促,准备回老家了
creep 回答时间:2016-12-28 13:37:24
@wofei1314 放假真早!!!
Paderboy 回答时间:2016-12-28 14:44:22
多谢分享。。
zero99 回答时间:2016-12-28 15:24:14
帮顶下
zhangdaijin 回答时间:2016-12-28 15:54:04
不错的分享
五哥1 回答时间:2016-12-28 19:17:34
分享下制作过程吧
andypanfan 回答时间:2016-12-30 09:30:36
5265325 回答时间:2016-12-30 16:09:58
wofei1314 回答时间:2016-12-31 11:35:07
五哥1 发表于 2016-12-28 19:17
分享下制作过程吧

会的,照片啥的现在还没来得及,目前回老家了。。。等回到公司一定补上~
zbber 回答时间:2017-1-1 07:39:12
分享下制作过程吧
damiaa 回答时间:2017-1-1 10:21:55
谢谢分享!
5265325 回答时间:2017-1-1 12:08:48

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版