微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > STM32单片机小Tips(6):玩转IAR,开发STM32

STM32单片机小Tips(6):玩转IAR,开发STM32

时间:02-16 来源:本站整理 点击:

  从51开始,单片机玩了很长时间了,有51,PIC,AVR等等,早就想跟潮流玩玩ARM,但一直没有开始,原因 -----不知道玩了ARM可以做什么(对我自己而言)。如果为学习而学习,肯定学不好。然后cortex-m3出来了,据说,这东西可以替代单片机,于 是马上开始关注。也在第一时间开始学习,可惜一开始就有点站错了队,选错了型(仍是对我自己而言)。我希望这种芯片应该是满大街都是,随便哪里都可以买得 到,但我选的第一种显然做不到。为此,大概浪费了一年多时间吧,现在,回到对我来说是正确的道路上来啦,边学边写点东西。
  闲话多了些,就权当前言了。下面准备开始。


  STM32单片机小Tips之RTC实践

  BKP还没有搞完,怎么又换到了RTC上了,因为RTC和BKP有些联系,想不关联还不行呢。

  以下是数据手册上有关RTC的介绍:

  ******介绍开始

  15.1 RTC 简介

  实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。

  RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。

  系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问:

  ● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位来使能电源和后备接口时钟

  ● 设置寄存器PWR_CR的DBP位使能对后备寄存器和RTC的访问。

  ******介绍结束

  下面就以库中所带的实例来玩这个RTC,正好也要解决TAMPER引脚的问题。

  这次要用到的例子是这个:

  


  有关配置没有什么可多说的,把上一个例子:BKP-》Backup_Data中修改过的:

  stm32_eval.c

  stm3210e_eval.h

  stm32_eval.h

  三个文件复制过来,建立工程,一路顺风,非常顺利地编译、链接好,然后进入调试,结果,出问题了,见下面:

  


  进入调试界面即停在了反汇编界面。一旦执行程序,立即就停下来。这个BKPT指令是个什么东西呢?查了一下指令表,原来是个断点指令,那为什么会停止在这里呢?万能的网啊,一搜就出来了,感谢前人的努力,感谢伟大的网。..。

  结论是:" 凡是用到printf的都会出现这样的问题。"

  解决方法:

  


  打开Options for Target项,把那个Use MicroLIB前面打上勾,重新编译链接即可。

  出现问题的原因,网上的相关解释是:这是Printf库函数的问题,需要使用MicroLIB这个库来替代默认的库。原因是默认printf并非使用串口,所以要改掉。

  在main.c中有这样一段函数:

  /**

  * @brief Retargets the C library printf function to the USART.

  * @param None

  * @retval None

  */

  PUTCHAR_PROTOTYPE

  {

  /* Place your implementation of fputc here */

  /* e.g. write a character to the USART */

  USART_SendData(EVAL_COM1, (uint8_t) ch);

  /* Loop until the end of transmission */

  while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)

  {}

  return ch;

  }

  根据这段函数的说明,就是做这个事情的。

  但是还有一些疑问:

  (1)这个例子的readme.txt中并没有说明要用MicroLIB这个库的事情。

  (2)如果不用硬件,而是用软件仿真,也是不需要使用MicroLIB库的。

  因此,有关MicroLIB的问题还不是特别明确,还需要进一步研究。是否是这段程序还用到了scanf的原因?

  例子的运行

  如果是第一次运行,那么会出现如下画面:

  


  即其中有提示RTC没有初始化,要求进行设置的提示,根据提示分别送入小时,分钟,秒的数值,即完成设置工作,程序不断地将当前时间通过串口送出。

  如果在VBAT端接入后备电池,那么断电后再上电显示的信息如下:

  


  其中提示RTC已初始化,不需要再进行初始化,直接将时间不断地从串口送出。

  程序解读

  /**

  * @brief Configures the RTC.

  * @param None

  * @retval None

  */

  void RTC_Configuration(void)

  {

  /* 开启PWR和BKP模块的时钟 */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* 允许对BKP进行存取操作*/

  PWR_BackupAccessCmd(ENABLE);

  /* 初始化BKP区域*/

  BKP_DeInit();

  /* LSE允许,这里LSE是指外部接的32768HZ 晶振的一个振荡器,它使用PC14和PC15两条引脚。有关这部分的一些细节描述如下:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top