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

发布者:HarmonyInLife最新更新时间:2024-01-08 来源: elecfans关键字:STM32  单片机  IAR 手机看文章 扫描二维码
随时随地手机看文章

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


  闲话多了些,就权当前言了。下面准备开始。

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


  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两条引脚。有关这部分的一些细节描述如下:

  当备份区域由V DD (内部模拟开关连到V DD )供电时,下述功能可用:

  ● PC14和PC15可以用于GPIO或LSE引脚

  ● PC13可以作为通用I/O口、TAMPER引脚、RTC校准时钟、RTC闹钟或秒输出

  当后备区域由VBAT供电时(VDD消失后模拟开关连到VBAT),可以使用下述功能:

  ● PC14和PC15只能用于LSE引脚

  ● PC13可以作为TAMPER引脚、RTC闹钟或秒输出

  */

  RCC_LSEConfig(RCC_LSE_ON);

  /* 等待LSE振荡器就绪 */

  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

  {}

  /* 选择LSE作为RTC的时钟源

  说明:RTC时钟源可以是以下三种之一:

  ─ HSE 时钟除以 128

  ─ LSE 振荡器时钟

  ─ LSI振荡器时钟

  其中LSI是一个内部的低频RC振荡器。关于RTC的这三个时钟各有何特点,见下面的说明。

  */

  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* RTC时钟允许*/

  RCC_RTCCLKCmd(ENABLE);

  /* 等待RTC寄存器同步

  理由如下:

  15.3.3 读 RTC 寄存器

  RTC核完全独立于RTC APB1接口。

  软件通过APB1接口访问RTC的预分频值、计数器值和闹钟值。但是,相关的可读寄存器只在与RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此的。

  这意味着,如果APB1接口刚刚被开启之后,在第一次的内部寄存器更新之前,从APB1上读出RTC寄存器的第一个值可能被破坏了(通常读到0)。下述几种情况下能够发生这种情形:

  ● 发生系统复位或电源复位

  ● 系统刚从待机模式唤醒(参见4.3节)。

  ● 系统刚从停机模式唤醒(参见4.3节)。

  所有以上情况中,APB1接口被禁止时(复位、无时钟或断电)RTC核仍保持运行状态。 因此,若在读取RTC寄存器曾经被禁止的RTC APB1接口,软件首先须等待RTC_CRL寄存器中

  的RSF位(寄存器同步标志)被硬件置1。

  void RTC_WaitForSynchro(void)

  {

  /* Clear RSF flag */

  RTC-》CRL &= (uint16_t)~RTC_FLAG_RSF;

  /* Loop until RSF flag is set */

  while ((RTC-》CRL & RTC_FLAG_RSF) == (uint16_t)RESET)

  {

  }

  }

  */

  RTC_WaitForSynchro();

  /* 等待最后写操作完成*/

  RTC_WaitForLastTask();

  /* 允许秒中断,相应代码如下:

  void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState)

  {

  /* Check the parameters */

  assert_param(IS_RTC_IT(RTC_IT));

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)

  {

  RTC-》CRH |= RTC_IT;

  }

  else

  {

  RTC-》CRH &= (uint16_t)~RTC_IT;

  }

  }

  而调用这段程序的代码中的第一个参数是:

  #define RTC_IT_SEC ((uint16_t)0x0001) /*!《 Second interrupt */

  可见它是对RTC-》CRH的最低位进行操作,CRH相关内容见下面的图。

  */

  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  /* 等待最后的写操作完成*/

  RTC_WaitForLastTask();

  /* 设置RTC预分频器: set RTC period to 1sec */

  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  /* 等待最后的写操作完成*/

  RTC_WaitForLastTask();

  }

  下面的图是有关RTC时钟选择的问题,其中说明了各种时钟的工作特性:

  


  下面的图是有关RTC_CRH寄存器的描述,放在这里是为了说明SECIE标志位。

  



  STM32单片机学习小Tips之数据的保存和毁灭(2)

  和以前学到的有关数据保存不同,这里的数据保存还有“保密”之意,即一旦受到意外的侵入,STM32将毁灭数据。这是通过Tamper机制来实现的。

  以下是数据手册中的有关说明:

  5.3.1 侵入检测

  当TAMPER引脚上的信号从0变成1或者从1变成0(取决于备份控制寄存器 BKP_CR的TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。 然而为了避免丢失侵入事件,侵入检测信号是边沿检测的信号与侵入检测允许位的逻辑与,从而在侵入检测引脚被允许前发生的侵入事件也可以被检测到。

  ● 当 TPAL=0 时:如果在启动侵入检测TAMPER引脚前(通过设置TPE位)该引脚已经为高电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现上升沿)。

  ● 当 TPAL=1 时:如果在启动侵入检测引脚TAMPER前(通过设置TPE位)该引脚已经为低电平,一旦启动侵入检测功能,则会产生一个额外的侵入事件(尽管在TPE位置’1’后并没有出现下降沿)。

  设置BKP_CSR寄存器的TPIE位为’1’,当检测到侵入事件时就会产生一个中断。

  在一个侵入事件被检测到并被清除后,侵入检测引脚TAMPER应该被禁止。然后,在再次写入备份数据寄存器前重新用TPE位启动侵入检测功能。这样,可以阻止软件在侵入检测引脚上仍然有侵入事件时对备份数据寄存器进行写操作。这相当于对侵入引脚TAMPER进行电平检测。

  注:当V DD电源断开时,侵入检测功能仍然有效。为了避免不必要的复位数据备份寄存器,TAMPER引脚应该在片外连接到正确的电平。

  显然,Tamper需要硬件与之配合。以上数据手册描述了硬件配置时的一些注意事项。

  (1) 可以是把引脚由低电平到高电平认为是一次侵入,也可以把引脚从高电平变到低电平认为是一次侵入,这通过TPAL来设置。

  


  (2) Tamper机制需要被启动才能起作用。但在启动之前,如果引脚已处于设定的状态,那么一旦启动,就会产生一次Tamper事件,这需要注意,否则会引起数据的意外丢失而不自觉。

  (3) 即便芯片上的VDD电源断开,(只要仍有VBAT),那么Tamper检测仍是有效的,因此,设计硬件时必须要小心,如果某设计是将Tamper引脚通过上拉电阻接VDD,并在这个引脚上接入机械开关到地。如果开关导通,那么就是一次Tamper事件,这个没有问题。但是,如果电源断开(VDD变低),也会引发一次Tamper事件,而这往往并不是设计都的本意。因此,这个引脚的上拉电阻必须接到VBAT而不是接到VDD。

  (4) 总的来说,TAMPER并不复杂,下面来看一看代码。

  


  这次是用的STM32库中的这个例子。

  有关LED的设置,这里就不再重复了,和上一篇文章(数据的保存与毁灭(1)相同)。

  /* Enable write access to Backup domain */

  PWR_BackupAccessCmd(ENABLE);

  这是打开BKP功能。

  /* Clear Tamper pin Event(TE) pending flag */

  BKP_ClearFlag();

  清除Tamper事件

  /* Tamper pin active on low level */

  BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);

  配置Tamper引脚究竟是高电平有效还是低电平有效,这个再研究一下,继续跟踪:

  /**

  * @brief Configures the Tamper Pin active level.

  * @param BKP_TamperPinLevel: specifies the Tamper Pin active level.

  * This parameter can be one of the following values:

  * @arg BKP_TamperPinLevel_High: Tamper pin active on high level

  * @arg BKP_TamperPinLevel_Low: Tamper pin active on low level

  * @retval None

  */

  void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel)

  {

  /* Check the parameters */

  assert_param(IS_BKP_TAMPER_PIN_LEVEL(BKP_TamperPinLevel));

  *(__IO uint32_t *) CR_TPAL_BB = BKP_TamperPinLevel;

  }

  CR_TPAL_BB又是什么呢?

  /* Alias word address of TPAL bit */

  #define CR_OFFSET (BKP_OFFSET + 0x30)

  #define TPAL_BitNumber 0x01

  #define CR_TPAL_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPAL_BitNumber * 4))

  要看懂上面有关CR_TPAL_BB的相关定义及理解为何这样写,恐怕又要涉及到Contex的另一个重要内容,即bit-band,这个暂不深究,留待下次学习(说句闲话:bit-bank我早就看到,就是没有兴趣深入了解,因为没觉得什么地方有用到,今天既已知其用途,改日必去改看,,,所以只有动起来,才能学更多的东西)。这里只管当它是能够直接设定该平是0或都是1就行了。

  即根据实参决定BKP_CR中的TPAL究竟是0还是1。可选参数为:

  #define BKP_TamperPinLevel_High ((uint16_t)0x0000)

  #define BKP_TamperPinLevel_Low ((uint16_t)0x0001)

  BKP的其他用途:

  BKP的寄存器可以用来存储RTC校验值的校验寄存器。

  在PC13管脚(当该管脚不用于侵入检测时)上输出RTC校准时钟,RTC闹钟脉冲或者秒脉冲

  为方便测量,RTC时钟可以经64分频输出到侵入检测引脚TAMPER上。通过设置RTC校验寄存器(BKP_RTCCR)的CCO位来开启这一功能。 通过配置CAL[6:0]位,此时钟可以最多减慢121ppm。

  

  

  下面以RTC的那个例子为例,来看一看如何用Tamper(PC13)引脚来送出信号。

  /* 打开PWR和KBP模块的时钟信号 */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

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

  PWR_BackupAccessCmd(ENABLE);

  /* 禁止引脚的TAMPER功能*/

  BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */

  /* 允许时钟信号在TAMPER引脚输出*/

  BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);

  这样就可以了,也不复杂。

  需要说明的一点是,PC13这个引脚不需要被配置成输出引脚,但在这一时刻它是起到输出作用的。

  BKP_RTCOutputConfig()这个函数中所用到的参数可以有这样的一些:

  BKP_RTCOutputSource_None

  不允许在Tamper引脚输出信号

  BKP_RTCOutputSource_CalibClock

  在Tamper引脚上输出RTC时钟经64分频后的频率信号

  BKP_RTCOutputSource_Alarm

  在Tamper引脚上输出RTC报警信号

  RTCOutputSource_Second

  在Tamper引脚上输出秒信号

  经测试,

  (1)在Tamper引脚上输出的信号,不受复位的影响!当然,这是有条件的,条件是复位时不会执行到操作RTC的相关代码。

  (2) 在用J-LINK写入代码时,Tamper引脚输出的信号,不受影响,照样输出!

  (3)断电之后再上电,Tamper引脚送出的信号,不受影响,照样输出!

  (4) 去掉VBAT供电端的电力供应,断电,再上电,Tamper引脚送出的信号消失!

  判断:前面的程序写的有关标志被保存在BKP区域,不断电不会消失。这是否对电池的寿命有影响呢?毕竟送出波形也会有消耗的。

  最后用两个图来结束,分别是运行时的BKP内容和POWER,RESET,CLOCK的内容。

  

  



  STM32单片机小Tips之玩转IAR,开发STM32

  记得本笔记开始时曾说过,我选用keil,理由是keil我熟,而当时我什么都不懂,总要找个熟悉点的东西,并且说过,如果需要用到IAR时,肯定上手也很快。这回要用IAR了,看一看上手究竟快不快啦!

  资源列表:

  芯片:STM32103VC

  库:3.3

  JLINK:V8

  IAR:5.3

  工作目标:编译库中的例子。

  工作过程:

  (1)文件夹结构

  


  基本上没有变化。

  为什么要强调这个呢,这可和设置有很大的关系。

  接下来看例子文件

  


  其中上面的那个文件夹中包含了大量的例子,而下面的这个文件夹则包含了几种编译器的工程例子,里面有一些东西是我们需要用到的。

  再继续

  这次偷了点懒,没有专门为源程序建立一个文件夹,直接把工程文件和源程序文件放在一起了,当然,也有一个因素,是因为使用IAR默认设置就做得相当的“干净”,编译完了后基本上没有多出几个文件出来。要是keil,那可不得了,,,

  


  在iar中用File-》New-》WorkSpace新建一个工作区,然后用Project-》Creat New Project新建一个工程。

  


  起名保存等等吧,这一类的问题就不在这里一一列出了。

  总之我们做好了一个名为IOToggle的工程,然后就要将文件加入到工程中去了。

  为了便于区分,同样在IOToggle中建立3个组,如下图所示。

  


  将IOToggle文件夹中的所有C文件全部加入到APP组,同时再将

  


  中的stm32_eval.c文件加入这个组中。

  在CMSIS组中加入的文件是:

  


  其中core_cm3.c在LibrariesCMSISCM3CoreSupport文件夹中,system_stm32f10x.c在LibrariesCMSISCM3DeviceSupportSTSTM32F10x文件夹中,而startup_stm32f10x_hd.s在LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartupiar中。

  在LIB文件夹中加入的文件是:

  


  这些文件当然都是3.3库所提供的,在LibrariesSTM32F10x_StdPeriph_Driversrc文件夹中。

  至此,文件加入完毕。

  从下面开始有两个选择

  1.直接使用J-LINK

  接下是重要的设置工作。

  


  接下来这里很重要

  

  设定头文件所在位置,这个如果设置不对,编译不能通过。

  $PROJ_DIR$

  设定项目所在位置,如果这个没有的话,会找不到stm32f10x_it.h等头文件。

  $PROJ_DIR$。.。.。.。.LibrariesCMSISCM3CoreSupport

  这里的。.表示的是上级目录的意思(DOS下的东西,曾经是那么的熟悉)

  $PROJ_DIR$。.。.。.。.LibrariesCMSISCM3DeviceSupportSTSTM32F10x

  $PROJ_DIR$。.。.。.。.LibrariesSTM32F10x_StdPeriph_Driverinc

  $PROJ_DIR$。.。.。.。.UtilitiesSTM32_EVAL

  其他的都不多说了,如果做其他工程时,目录结构与上面的不相同,那么基于这些知识就能自行修改这些参数了。

  在Defined sybols中预设了一个符号,这也是必须的,否则会有大量的编译错误出现。

  接下来,在Link中还有一个重要的设置:

  


  需要更改override default的设置,不能使用其默认的设置。

  


  这个EWARMv5在这里:ProjectSTM32F10x_StdPeriph_TemplateEWARMv5

  要选择这个stm32f10x_flash.icf替换掉原来的默认设置,这个其实就是准备向flash中写代码的。

  接下来要设置的是Debugger。我们选择

  


  接着切换到Download

  


  这里只要选中Use flash loader即可,不需要做修改。

  接着可以到J-Link/J-Trace中去修改,不过,我用的都是默认的参数,没有什么需要修改的。

  2.使用RDI

  如果不用J-Link,也可使用RDI设置

  


  然后,单击RDI,进入RDI设置

  


  这个红色框中的是需要自己找的,要找到SEGGER的安装目录,并找到这个DLL文件。

  接着就会在右下角出现这个

  

  单击RDI,出来对话框

  

  单击Configuration进入设置界面

  


  勾选Enable flash programming,然后选择指定的芯片即可。

  至此,IAR基本算是玩起来了。


关键字:STM32  单片机  IAR 引用地址:STM32单片机小Tips(6):玩转IAR,开发STM32

上一篇:stm32mp157教程案例 STM32MP157移植LVGL
下一篇:STM32单片机的原理详解 STM32时钟系统的配置方法

推荐阅读最新更新时间:2024-11-13 19:25

基于51单片机+红外遥控解码+LCD1602显示
基本介绍 什么是红外线? 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线.红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。 红外线系统的组成 红外线系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射。常用的有通过
[单片机]
基于51<font color='red'>单片机</font>+红外遥控解码+LCD1602显示
利用8031单片机,设计跑马灯和流水灯
正常情形下使P1口八个发光二极管做流水灯显示。 紧急情况下,使八个发光二极管做鸳鸯戏水显示。 鸳鸯戏水就是一共是八个灯,一次亮四个,奇数灯和偶数灯分开亮。即:这次是1357灯亮,下次是2468灯亮。 要求用汇编语言编制程序,多谢。 问题补充:要求在外部扩展一个4KB的外部存储器。 悬赏分:80 - 解决时间:2010-1-7 14:43 ===================================== 最佳答案: ;------------------------------------ ;题目要求在外部扩展存储器,就是说P0P2口,我们不能使用,那么就用P1外接8个LED,用P3.2
[单片机]
基于STM32从零写操作系统系列---基于寄存器写串口驱动
目的 尝试基于寄存器层面,编写串口的驱动。用这种方式编写串口驱动,有点类似于使用汇编语言。面向的是每一个单独的寄存器,通过读、改、写的手段,配置寄存器。但是这种方式能够更接近硬件,用硬件的思维编程。 相对于《基于STM32从零写操作系统系列---使用C语言》,这章重新调整了文件结构,让项目文件更好管理和维护。主要使用了makefile的嵌套编译方法来编译多目录下的代码文件。 分析 1.Makefile嵌套编译 首先简单来看一下文件结构: 再看一下顶层Makefile,主要差异如下: 各子目录下的Makefile比较简单 其中需要注意的是: 在windows的cmd命令行中for命令用于查找
[单片机]
基于<font color='red'>STM32</font>从零写操作系统系列---基于寄存器写串口驱动
基于LabVIEW和MCS-51单片机实现数据采集与信息分析系统的设计
1、LabVIEW部分设计 1.1VISA简介 LabVIEW提供了功能强大的VISA库。VISA(Virtual Instrument Software Architecture)——虚拟仪器软件规范,是用于仪器编程的标准I/O函数库及其相关规范的总称。VISA库驻留于计算机系统中,完成计算机与仪器之间的连接,用以实现对仪器的程序控制,其实质是用于虚拟仪器系统的标准的API。VISA本身不具备编程能力,它是一个高层API,通过调用底层驱动程序来实现对仪器的编程,其层次如图1所示。VISA是采用VPP标准的I/O接口软件,其软件结构包含三部分,如图2所示。 与其他现存的I/O接口软件相比,VISA的I/O控制功能具有如下几个特
[测试测量]
基于LabVIEW和MCS-51<font color='red'>单片机</font>实现数据采集与信息分析系统的设计
整理单片机串口小招数
招一:把函数发生器当串口发送器来用 如果要调试串口,而你只有一块扳没有计算机,这种情况下,可以用函数发生器当串口发送器来用。若波特率是9600,需将函数发生器频率调到9600/2=4800HZ上,输出的TTL电平直接到RXD;如果使用的是RS232接口,频率不变的话就选函数双极性(交流输出)发生器。在这里提醒一下,电平有峰峰值到12VPP就够了。此时单片机收到数据必须是55H,可以用MOV P1、SBUF、在P1上测量电压,没显示也可以测串口了。 理由:55H 是01010101 串口启始位是0,先发55H最低位,于是一帧就是0(启始)101010101(停止)-0(启始)101010101(停止),正好是1/2波特率的方波。 招
[单片机]
LCD液晶显示的51单片机简单计算器
概述 LCD液晶显示的51单片机简单计算器可实现完成了两个范围在0到255的数加、减、乘、除运算,其中减法可显示负数,除法只保留整数并由LCD液晶显示。并在实验室实验箱,实现上述功能。完成该任务需要熟悉和了解控制LCD液晶屏的显示的方法,矩阵键盘读取按键值的方法、89C51系列单片机的相关知识、C51编程和数字电子技术的相关知识。 完整代码:https://download.csdn.net/download/weixin_43786907/16524021。 方案 我使用实验室试验箱的2×8矩阵键盘作为的16个按键作为输入分别为0到9、“+”、“-”、“*”、“/”、“=”与复位,由单片机计算并通过LCD显示。 矩阵键盘
[单片机]
LCD液晶显示的51<font color='red'>单片机</font>简单计算器
56-基于51单片机的IC卡智能水表设计
具体实现功能 系统由STC89C52单片机+LCD1602+电磁阀+继电器+流量计+IC卡读写模块模块构成。 具体功能: (1)第一行显示IC卡ID号码,此时未读到IC卡,所以ID显示为0,第二行显示的依次是剩余的水量和IC卡内的余额。若水量余额大于0,电磁阀得电,用户可以用水。 (2)当智能水表检测到IC卡时,第一行显示IC卡ID号码,第二行显示的是剩余的水量和IC卡内的余额。卡片内的余额可以充值到水表里。此时水表内有水量,电磁阀开启,按下用水按钮,模拟流量计旋转,用水信号输入到单片机,单片机将水的余量在屏幕的第二行显示出来,当水的余量小于等于10时,发光二极管点亮,提示余额不足,当水的余量等于0时,继电器断开,切断
[单片机]
56-基于51<font color='red'>单片机</font>的IC卡智能水表设计
STM32的看门狗使用方法
简介:stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。主要作用是——可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 具体的实现步骤:开启看门狗,设置减计数的初始值,当计数值达到超时值时,产生MCU复位,此时本来运行的程序终止重新启动单片机(发生了故障)。在使用了看门狗之后,在正常运行的程序中加入喂狗的程序,即采用定时器的方式每隔一段时间进行一次喂狗重置计数装载值,这样,只要程序正常运行,没有出现故障或软件错误,就会不断的定时喂狗,从而不会使计数值达到超时值产生复位。 独立看门狗IWDG: IWDG主要性能 ●自由运行的递减
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved