打印
[应用相关]

[经验] 嵌入式STM32 深入浅出(新手必看)五

[复制链接]
373|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2021-3-18 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32笔记之十三:恶搞,两只看门狗

  a) 目的:
  了解两种看门狗(我叫它:系统运行故障探测器和独立系统故障探测器,新手往往被这个并不形象的象形名称搞糊涂)之间的区别和基本用法。
  b) 相同:
  都是用来探测系统故障,通过编写代码定时发送故障清零信号(高手们都管这个代码叫做“喂狗”),告诉它系统运行正常。一旦系统故障,程序清零代码(“喂狗”)无法执行,其计数器就会计数不止,直到记到零并发生故障中断(狗饿了开始叫唤),控制CPU重启整个系统(不行啦,开始咬人了,快跑……)。
  c) 区别:
  独立看门狗Iwdg——我的理解是独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器。(这条狗是借来的,见谁偷懒它都咬!)主要用于监视硬件错误。
  窗口看门狗wwdg——我的理解是系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。(这条狗是老板娘养的,老板不干活儿他不管!)主要用于监视软件错误。
  d) 初始化函数定义:鉴于两只狗作用差不多,使用过程也差不多初始化函数栓一起了,用的时候根据情况删减。
  void WDG_Configuration(void);
  e) 初始化函数调用:
  WDG_Configuration();
  f) 初始化函数
  void WDG_Configuration() //看门狗初始化
  {
  //软件看门狗初始化
  WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频4ms
  // (PCLK1/4096)/8= 244 Hz (~4 ms)
  WWDG_SetWindowValue(65); //计数器数值
  WWDG_Enable(127); //启动计数器,设置喂狗时间
  // WWDG timeout = ~4 ms * 64 = 262 ms
  WWDG_CleaRFlag(); //清除标志位
  WWDG_EnableIT(); //启动中断
  //独立看门狗初始化
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//启动寄存器读写
  IWDG_SetPrescaler(IWDG_Prescaler_32);//40K时钟32分频
  IWDG_SetReload(349); //计数器数值
  IWDG_ReloadCounter(); //重启计数器
  IWDG_Enable(); //启动看门狗
  }
  g) RCC初始化:只有软件看门狗需要时钟初始化,独立看门狗有自己的时钟不需要但是需要systic工作相关设置。
  RCC_APB1PeriphclockCmd(RCC_APB1Periph_WWDG, ENABLE);
  h) 独立看门狗使用systic的中断来喂狗,所以添加systic的中断打开代码就行了。软件看门狗需要在NVIC打开中断添加如下代码:
  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中断等级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应中断优先级
  NVIC_Init(&NVIC_InitStructure); //打开中断
  i) 中断程序,软件看门狗在自己的中断中喂狗,独立看门狗需要使用systic的定时中断来喂狗。以下两个程序都在stm32f10x_it.c文件中。
  void WWDG_IRQHandler(void)
  {
  WWDG_SetCounter(0x7F); //更新计数值
  WWDG_ClearFlag(); //清除标志位
  }
  void SysTickHandler(void)
  { IWDG_ReloadCounter(); //重启计数器(喂狗)
  }
  j) 注意事项:
  i. 有狗平常没事情可以不理,但是千万别忘了喂它,否则死都不知道怎么死的!
  ii. 初始化程序的调用一定要在systic的初始化之后。
  iii. 独立看门狗需要systic中断来喂,但是systic做别的用处不能只做这件事,所以我写了如下几句代码,可以不影响systic的其他应用,其他systic周期代码也可参考:
  第一步:在stm32f10x_it.c中定义变量
  int Tic_IWDG; //喂狗循环程序的频率判断变量
  第二步:将SysTickHandler中喂狗代码改为下面:
  Tic_IWDG++; //变量递增
  if(Tic_IWDG>=100) //每100个systic周期喂狗
  { IWDG_ReloadCounter();//重启计数器(喂狗)
  Tic_IWDG=0; //变量清零
  }

  STM32笔记之十四:基本问题,来讨论一下软件架构

  网上大家都在讨论和学习,但是对于架构这个基本问题却没几个人讨论。个人认为有个好的架构是写好代码的基础,可以使后期的调式工作事半功倍!!
  1、 架构组成:我的程序代码分为四种结构
  a) 顺序执行代码
  定义:按照顺序逐行执行的代码
  优点:是思路简单,代码可靠不易被干扰。
  缺点:占用资源
  用途:只用来各种变量、函数的定义,硬件的初始化程序
  位置:main.c的开始一直到main函数的while函数之前
  b) 空闲执行代码
  定义:在CPU空闲的时候才执行的代码
  优点:不占用资源
  缺点:执行的实时性不能保证
  用途:非实时任务,调试信息输出,不重要的状态指示
  位置:main.c的main函数的while函数内部
  c) 中断执行代码
  定义:由软硬件事件打断整个程序而执行的代码
  优点:可以保证实时性,各种中断可以安排优先顺序
  缺点:关系相对复杂,互相之间容易干扰
  用途:触发性的代码,比如接收数据,响应外部设备,按钮的相应
  位置:stm32f10x_it.c内部
  d) 循环执行代码
  定义:按照时间周期执行的代码
  优点:定期自动执行
  缺点:实时性不好
  用途:需要周期执行的任务,状态检查及相关信息输出,数据记录
  位置:stm32f10x_it.c的SysTickHandler内部
  e) DMA自动代码
  定义:不需要主程序干预,外设自动执行
  优点:自动刷新数据,不占用CPU资源
  缺点:不能控制
  用途:数据通信存储,AD转换
  位置:不需要
  2、架构执行顺序图
  下载 (51.33 KB)

  STM32学习笔记之十五——IAR4的最后疯狂,笨笨的开发模板下载

  准备大换血了,包括开发环境升级和固件升级,那个需要一定过程,吧之前完成的模板跟大家共享一下。
  我的程序库特点:
  a) 默认兼容ST-LINK-II,IAR EWARM 4.42A,Flash调试,使用串口1,GPIOA的3、4、
  5、6脚输入,GPIOB的1、2、10、11脚输出,其他有可能需要更改设置
  b) 为操作方便减少了目录的层次
  c) 为学习方便使用网友汉化版2.0.2固件,主要是库函数中c代码的注释。
  d) 加入必用的flash(读取优化),nvic(RAM与Flash调试选择),rcc(时钟管理模
  板,开启外设时钟模板),gpio(管脚定义模板)的初始化代码,所有模板代码用到的
  时候只要去掉前面的注释"//",根据需求填入相应值就可以了。
  e) 因为自己记性不好,所以main函数中的代码做到每行注释,便于自己以后使用。
  f) 列出常见应用代码模板与ASCII常用列表。
  g) 集成putchar字符输出和printf的重定义到串口的代码,便于调试。
  h) 集成NVIC中断管理模板,EXTI外部I/O中断模板
  i) 针对自己情况集成PWM输出模板和CAP脉宽捕捉模板,并全部注释。
  j) 集成系统循环时钟的初始化函数模板
  k) 集成自己编写精确延时代码,不会影响systic的周期代码的执行。
  l) 集成两种看门狗的使用代码,小心使用
  M) 集成hex生成设置命令,位置在编译目录(STM32F103C8)的Exe下,集成ISP软件便
  于脱离仿真器的串口调试STMISP.exe。
  由于注释写的太多,还加入自己编程以来的许多格式习惯,所以许多人会觉得混乱不堪,在
  此声明,此程序库仅仅为个人学习之用!

  STM32学习笔记之十六——题外话,自己做块工程板

  一、我的学习计划将STM32单片机的硬件设计工作:
  第一步——用STM32F103CBT6的48脚芯片,为光电平台的简单控制为目标,实现基本外围硬件、PWM、串口、I/O。将SPI、I2C留插针。
  第二步——为集成传感器应用为目标,在第一步硬件基础上制作功能性的套版,两板连接实现AD、SPI、I2C、RTC等等功能。
  二、硬件规划
  选用STM32F103CBT6,面积7×7mm,128K flash,16K RAM,4个16bit PWM,12个12bit PWM或CAP,2个SPI,2个I2C,3个串口,1个CAN,1个USB,),12ADC。
  管脚分配目标1如图,之后的功能包括:4个AD,3个串口(1个与I2C复用),1个SPI,8个(两组)PWM输入输出,1个USB,1个I/O,1个MCO。
  三、管脚分配:
  下载 (32.83 KB)
  2009-4-26 16:14
  四、altium DESIGNER 6(protel的第六个版本)操作笔记
  之所以选择这个软件三个理由:1、界面习惯兼容Protel。2、操作习惯于Windows类似方便。3、可输出igs用于结构设计。
  软件使用笔记如下:
  a) 流程:新建工程,添加原理图,添加SCH库,画原理图,添加PCB库,设定封装,添加PCB,布线,检查,导出生产文件。
  b) 新建工程:最好使用自己以前的同版本文档设置,会包含各种库省去大量工作
  c) 添加器件到SCH,可使用复制粘贴的办法,注意管脚,有些需要外壳接地的器件把外壳的焊点画出来。完成后点击放置,改动后再器件名称点击右键更改。
  d) 画原理图:操作类似其他windows软件,会自动检查错误连接和重复硬件。
  e) 添加器件到PCB库,最好使用拷贝粘贴的办法,最好有官方的焊点图。没有的话可以按照封装的型号直接去http://www.***search.com/搜索封装型号(不是器件型号),也有封装的相关尺寸和焊点图。
  f) 双击原理图的器件,在右下角改封装名称。
  g) 添加新的PCB到工程:
  “设计/规则”改线宽、线距、器件距离……;
  “设计/板子形状/重新定义板子形状”改工作区域大小,然后左键点击前置Keepout层,画电路板外形;
  “设计/板参数选项”改网格大小,器件和走线中鼠标捕捉的间隔大小……;
  “设计/Import changes From……”引入原理图的器件和连接方式,包括改动(出现对match提示选择继续就可以了);
  “查看/切换单位”改公制和英制;
  “工具/取消布线”取消已经布好的线;
  “自动布线”计算机自动布线,功能比Protel增强不少;
  “报告/测量距离”测量实际距离;
  在层标签单击,前置这个层。右键有隐藏层和显示层比较常用。
  屏幕中点击右键菜单中“设计/规则”、“选项/板参数选项”、 “选项/层叠管理”(添加和删除层)、“选项/显示掩藏”(针对各种类型进行显示和隐藏,查找未布的线就使用此功能后在操作框中点击“所有最终”然后点击“Apply”,再手工点击所有的选项为“隐藏的”再点“Apply”就能看到未布线的连线了)
  快捷键:空格键旋转器件,TAB键切换线宽和放置过孔。左键单击选择,左键按住移动器件(多个重叠会有列表选择,未松开时右键取消操作),左键双击改器件属性(所在层、位置……),右键按住移动鼠标平移视野,滚轮上下移动,滚轮按住移动鼠标放大缩小
  五、基本电路原理设计
  抛弃复杂设计,专注于可独立调式的CPU板设计。计划设计模块包括:供电、JTAG、晶振、RTC(电池引出)。
  注:未使用标准JTAG设计,原因有三:
  1、原设计太占管脚,这个尺寸实在难实现
  2、这只是CPU板具体应用会再做功能套版,上面可以连接标准JTAG
  3、有可能向USB烧写和SW双线调式方向转变,所以以后不一定会使用标准JTAG

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

945

主题

2711

帖子

5

粉丝