![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
stm32
文章平均质量分 55
枪眼
这个作者很懒,什么都没留下…
展开
-
bootloader的原理分析
1.1.2 定分区 bootloader分区:boot程序存储区,通常0x8000000开始 数据存储取:标志位等固件基本信息存储区,通常在boot分区和app分区中间; app分区:app程序存储区,前面两个分区留足空间后,剩下的即可定义为app区;.........原创 2022-07-17 13:03:55 · 1954 阅读 · 0 评论 -
can总线仲裁
如图,单元1和单元2同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到T时刻,单元1输出隐性电平,而单元2输出显性电平,此时单元1仲裁失利,立刻转入接收状态工作,不再与单元2竞争,而单元2则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。...原创 2022-06-05 00:19:46 · 864 阅读 · 0 评论 -
stm32-can简介
推荐阅读:【stm32f407】CAN总线_Wireless_Link的博客-CSDN博客 根据图中信息,tPCLK = 1/APB1_CLK;所以can波特率的计算公式如下:CAN_Baudrate = 1/(tq + tBS1 + tBS2) = 1/(tq*(1 + CAN_BS1 + CAN_BS2))CAN_Baudrate = APB1_CLK / CAN_Prescaler / (1 + CAN_BS1 + CAN_BS2)参考:STM32中CAN波特率的计算_Nan_Key的博客-CS原创 2022-06-04 11:36:51 · 2307 阅读 · 0 评论 -
STM32 串口DMA使用示例
STM32 DMA数据流向的三种模式外设到内存(Peripheral-to-memory)当DMA_SxNDTR寄存器等于0时,DMA传输会停止。此时需要软件清0寄存器DMA_SxCR中的EN位。在循环模式则不会停止。内存到外设(Memory-to-peripheral)内存到内存(Memory-to-memory)在stm32f4中由DMA_SxCR寄存器的DIR[1:0]决定数据传输的方向;循环模式使用了循环模式后,就算DMA产生传输完成标志,不清除这个标志,DMA也能正原创 2022-05-29 15:30:51 · 2854 阅读 · 0 评论 -
STM32F4系列定时器简介
STM32F4系列参考《stm32f4参考手册》STM32F4时钟系统系统时钟最大值180MHz,systick的时钟源是系统时钟HCLK/8或HCLK;systick默认是使用HCLK(最大168MHz)。根据正点原子《STM32F429开发指南-HAL库版本v1.1》第四章第三节(4.3)中描述,HCLK最大值是168MHz;在使用HAL初始化时钟时,需要手动配置系统时钟,具体可以翻阅源文档。STM32F4定时器TIM1,TIM8是高级定时器,时钟源是APB2,90*2=180MHz原创 2022-05-29 15:27:32 · 2040 阅读 · 0 评论 -
keil_mdk调试方法
利用.ini文件更改进入调试模式时的程序运行的起始地址FUNC void Setup(void){ SP = _RDWORD(0x8040000); PC = _RDWORD(0x8040000+4); _WDWORD(0xE000ED08,0x8040000);}LOAD .\Objects\microtome.axf INCREMENTALSetup();FUNC void hello_world(void){ printf("hello_world\原创 2022-05-28 20:55:25 · 215 阅读 · 0 评论 -
c语言空指针在stm32中的表现
访问空指针uint32_t * ptr = NULL;*ptr = 5;空指针指向0地址,0地址在cotex-m系列单片机中(由于BOOT配置方式),多数被映射到0x8000000,即代码起始地址。有疑问根据权威指南描述,访问这部分地址是允许的,且不会造成异常。根据数据手册描述,如果没配置好flash的操作,就直接写这部分地址,就会报PGPERR和PGSERR错误。调试结果也是这样,目前来看这两个异常不会触发hardfault之类的异常,但是如果没清除这些错误标志又操作flash,在stm32中会原创 2022-04-17 23:46:50 · 736 阅读 · 0 评论 -
gd32-adc的简介
规则组和注入组规则组的转换相当于程序的正常运行;注入组的转换相当于一个中断处理函数;所以注入组的转换可以优先于规则组的转换;单个adc规则组最多有16个通道;单个adc注入组最多4个通道;规则组用DMA的方式会好些;......原创 2022-04-18 00:15:51 · 1875 阅读 · 0 评论 -
DAP-LINK调试器资料收集
如有侵权,请联系博主删帖参考资料CMSIS-DAP下载器参考python支持包1.使用注意事项2 收集的资料SWD烧录协议翻译参考:SWD协议研究_guoliuly的博客-CSDN博客_swd协议 SWD读写数据有一个协议,擦除flash有相应的操作寄存器SWD命令,烧录(写flash)也有相应的操作寄存器SWD命令; 方案参考开贴记录SWD 脱机烧录器开发过程,请各路大神指教 (amobbs.com 阿莫电子论坛),吧主做成了烧录器,但细节没有详细说明,源码也没有开源。 SW原创 2022-04-09 10:56:08 · 1681 阅读 · 0 评论 -
分散加载文件的使用
参考1:(stm32分散加载文件.sct文件解析)http://news.eeworld.com.cn/mcu/2019/ic-news040143664.html参考2:(分散加载博客目录)https://blog.csdn.net/weixin_39118482/category_7617016.html1. 分散加载概念- 分散加载文件(即scatter file,后缀为.scf)。分散加载文件是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数原创 2022-04-09 10:34:33 · 1174 阅读 · 0 评论 -
stm32获取芯片厂商定义部分数据
stm32f103一些厂家定义的memory数据,参考《stm32参考手册》-存储器容量寄存器,基地址:0x1FFFF7E0;16位数据-产品唯一标识寄存器(96位),基地址:0x1FFFF7E8-微控制器设备ID编码,MCUID码,这个ID定义了STMCU的部件号和硅片版本;DBGMCU_IDCODE,32位寄存器,基地址0xE0042000;[11:0]是设备识别码,[31:16]是版本识别码;[15:12]保留-SW-DP状态机(Reset,idlestate...原创 2021-03-28 16:46:52 · 589 阅读 · 0 评论 -
stm32-GPIO使用注意事项
1.1 GPIO复用功能注意外设先开启,再将引脚初始化成复用功能。根据stm32参考手册8.1.4,如果先初始化IO再开外设会导致IO有一段时间处于不确定状态,这个状态不可控。1.2 GPIO电平特性根据《stm32参考手册》,GPIO输入驱动器是TTL,输出驱动器是MOS管;根据《stm32数据手册》,所有IO都是CMOS和TLL兼容(不需软件配置);由于上述两个特性,理论上,IO口的低电平最大值0.35VDD,高电平最小值2或0.65VDD,高电平最大值VDD+0.5;..翻译 2021-01-13 21:27:06 · 715 阅读 · 0 评论 -
stm32获取芯片厂商定义参数
stm32f103一些厂家定义的memory数据,参考《stm32参考手册》存储器容量寄存器,基地址:0x1FFFF7E0;16位数据;单位Kbytes产品唯一标识码寄存器(96位),基地址:0x1FFFF7E8微控制器设备ID编码,MCU ID码,这个ID定义了ST MCU的部件号和硅片版本;寄存器名DBGMCU_IDCODE,32位寄存器,基地址0xE004 2000;[11:0]是设备识别码;DEV_ID[11:0],0x412表示低容量设备;0x410表示中容量设备;0x414表示高容量翻译 2021-01-13 21:13:29 · 1375 阅读 · 0 评论 -
stm32-hardfault产生的原因分析
前言关于定位hardfault产生之前的程序运行情况,有如下两种方法:在keil里单步调试时在hardfault入口处打个断点,然后通过看寄存器的值,或直接用鼠标操作就能回退到上一层出错的位置;具体方法有很多人都分享过;使用armink的工具cmbacktrace,这是朱天龙老师在github上的一个开源项目,特意为cotex-m系列MCU做的异常追踪库;hardfault,有些时候找到触发路径,也不知道原因。其实触发hardfault的原因在《权威指南》里都说的很清楚了,并且cmbacktra翻译 2021-01-10 20:37:18 · 8173 阅读 · 0 评论 -
stm32的中断等待
1.看看《权威指南》中的原话《cotex-m3权威指南》——宋岩译《cotex-m3和cotex-m4权威指南》—— 清华大学出版社可以看到,在M3和M4的中断机制里,就是存在至少12周期的延迟的。而这个延迟就是压栈,跳转等等一系列动作造成的。如果优先级不够高,或有其它的关中断操作什么的,那这个延迟时间还会更长。具体有哪些操作会导致延迟时间变长,书中都有详细的描述。2. 中断延迟中的12周期是多长时间笔者做了一个实验,实验的具体步骤如下:初始化一个定时器T1,有PWM原创 2021-01-09 19:33:59 · 793 阅读 · 0 评论 -
stm32中的浮点数
浮点数总结1.浮点数原理简介1.1IEEE浮点表示IEEE浮点标准用V=(-1)^s*M*2^E的形式来表示一个数:符号(sign)s是符号位,1表示负,0表示正阶码(exponent)E的作用是对浮点数加权,这个权重是2的E次幂,取值范围(单精度-128~127,双精度-1024~1023)尾数(significand)M是一个二进制小数,它的范围是1~2-ε,或者是0~1-ε规格化数:阶码的位不全为0也不全为...原创 2021-01-09 18:41:19 · 13544 阅读 · 0 评论 -
PWM输出多一个杂波
问题如图:一、问题描述如上图的最右边有一个很细的线,根据步进电机控制算法,理论上应该输出10个脉冲,而最后一个很细的脉冲就是多出来的一个脉冲。二、猜测问题原因1.硬件问题,电路上的干扰;2.Stm32单片机问题,定时器问题3.软件逻辑问题;(最后发现是这个原因)三、验证猜测3.1验证猜测原因3软件逻辑问题由于软件逻辑是最容易看到的,所以就先从代码上去分析问题,逻辑如下:根据上述流程图,软件逻辑上初步没分析出什么问题,所以......原创 2021-01-09 18:43:51 · 2111 阅读 · 2 评论 -
stm32-内部时钟的使用
STM32-内部时钟LSI:40kHz低速内部RC振荡器,驱动独立看门狗,或用程序选择驱动RTCHSI:8MHz高速内部RC振荡器,可用于系统时钟;系统启动时默认使用该时钟为系统时钟,频率就是8MHz。另外,经过测试,得出几个结论点:1.如果调用了库的时钟初始化函数,初始化HSE外部高速时钟为PLL;当外部高速时钟有异常时,会导致PLL启动失败,会一直卡在某一个地方。2.当在运行过程中HSE出现异常(如用手触摸一个引脚),则会自动切换到HSI内部时钟;如果短路则不会切换,有看门狗会触发看门狗。原创 2021-01-05 23:56:44 · 4143 阅读 · 0 评论 -
stm32f1定时器单脉冲模式的使用
单脉冲模式简介摘录《stm32f1参考手册》中文版:单脉冲模式(OPM)是前述众多模式的一个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后,产生一个脉宽可程序控制的脉冲。意思就是说,可以将某个电平信号作为激励,当定时器收到激励信号,还可以延时一定时间输出PWM信号。根据配置可以输出单个PWM或多个。使用场景目前用过两个使用单脉冲的场景,一个是利用交流电过0点信号控制加热丝加热,另一个是利用交流电过0电信号控制泵的吸力;配置代码void timer_one_pulse_conf原创 2021-01-05 23:49:54 · 3163 阅读 · 3 评论 -
stm32中内存分配(堆、栈、malloc)
参考1:c语言中内存分配参考2:http://blog.csdn.net/shine0181/article/details/7305551(里面有对malloc和free的源码分析)1. stm32基础知识本文章所谈内容是基于stm32平台。所以也许需要对stm32的存储结构说明一下。如图(图片来自stm32官方手册): 图1图1是stm32整体存储器结构图,这些数字指的是存储器的地址范围,如下面倒数第3个Flash对应的地址是0x08原创 2021-01-01 16:54:38 · 8827 阅读 · 0 评论 -
stm32中堆、栈、flash、ROM、RAM、bss段、data段、text段、Code、Ro-data、 ZI-data、RW-data简介
1. 堆、栈、flash、ROM、RAM、bss段、data段、text段、Code、Ro-data ZI-data、RW-data的区别?1.1 堆、栈简介(是编译器分配的空间)堆栈是指在stm32启动文件中定义的那一段空间,是跟在data段和bss段后面的一块空间,要区别于操作系统里的线程栈。详情可查看.map文件在使用过程中,堆向高地址增长,栈向低地址增长;堆:是用户调用malloc()时可申请的内存。操作方式类似链表;栈:是提供给局部变量使用的,即由c语言机制自动申请和释放。操作方式类原创 2021-01-01 16:22:30 · 6974 阅读 · 2 评论