嵌入式 & MCU & STM32
文章平均质量分 56
嵌入式 & MCU & STM32
欲盖弥彰1314
如有一味绝境,非历十方生死。
展开
-
关于嵌入式软件分层设计
从会写代码,到想要写好代码,这个过程是很难受的。由于做的嵌入式软件,主要是MCU方面,都是要跟硬件底层打交道的软件设计,接手的别人的软件给人影响最深刻的就是典型的面向过程式编程,高层模块大量依赖低层模块,特别是高层模块依赖底层硬件。缺点: 修改底层模块,将影响高层模块。在实际应用中,底层模块又是经常要被修改的。怎么解决?依赖反转,低层模块依赖高层。怎么实现依赖反转?面向对象编程中有一个很重要的概念 —— 面向抽象接口编程。在C++中使用虚函数实现多态、抽象接口,C语言没有虚函数,对于OOPC来说只能原创 2020-09-12 16:03:38 · 3007 阅读 · 3 评论 -
单片机开发——应用消息队列处理事件
消息队列的5个常见应用场景https://segmentfault.com/a/1190000017130224想要在单片机开发应用消息队列处理事件主要是为了解耦,减少模块与模块之间的耦合。看过挺恶心的代码,一个事件就用一个变量做标志位,全局变量满天飞。 就想着用消息队列模仿消息驱动的机制来处理事件。有类似这样处理的:https://blog.csdn.net/u012210286/article/details/83313099然而这样的话处理队列事件的函数在每次增减消息都要去改动,所以想写个原创 2020-08-19 21:25:16 · 2323 阅读 · 3 评论 -
C语言——软件定时器
都说程序设计 = 算法 + 数据结构。数据结构是挨踢必修课,不过好像学了数据结构之后也没用来做过啥。不知道做啥,就写个软件定时器。软件定时器数据结构typedef struct __software_timer{ u32 timeout; //初始化时间计数器 u32 rep...原创 2020-03-01 21:28:36 · 2283 阅读 · 0 评论 -
STM32串口之环形队列接收数据
文章目录废话说在前面代码实现环形队列数据结构写一字节数据到队列判断队列是否写满读一字节的数据判断队列是否为空写多个字节到队列到STM32上测试废话说在前面码代码的应该学数据结构都学过队列。环形队列是队列的一种特殊形式,应用挺广泛的。因为有太多文章关于这方面的内容,理论知识可以看别人的,下面写得挺好的:STM32进阶之串口环形缓冲区实现代码实现环形队列数据结构typedef s...原创 2020-01-04 20:51:04 · 9535 阅读 · 25 评论 -
IAR目标代码4字节对齐
利用编译器一般定义数据变量都是4字节对齐的原理,当生成的目标代码是奇数字节,这时候就不是4字节对齐,当给目标代码最后加入一个4字节对齐的变量时,按照4字节对齐原理,最后的奇数字节后面的位置就被空出来达到4字节对齐的目的。如上图所示,在最后强加4字节后,n+1这个字节就会空出来将前面的本来的奇数字节补齐成4字节。是IAR的扩展关键字,强制编译,保证没有使用的函数或者变量也能够包含在目标代码中。无论最后是奇数是1个字节、2个字节、3个字节都是一样的,这里画演示图用3个字节。原创 2023-08-10 12:10:44 · 1208 阅读 · 0 评论 -
TMC2660驱动及调试记录
一款优秀的电机驱动芯片,驱动简单。或者直接看手册,手册也不复杂。原创 2023-02-12 01:28:14 · 4164 阅读 · 2 评论 -
NV040C语音芯片驱动调试
误以为所有地址都有声音,所以随便选择了一个地址进行调试,调试大半天都没有声音,误以为是时序问题调试了好久。后面发现是地址没有声音数据的。对于此次使用的芯片只定制了最开始的6个地址有声音,所以地址0x06及以上的都是没有声音的。动力系统项目定制的只有声音地址0x00~0x05有声音,分别对应不同报警等级。芯片某个声音地址是否有声音取决用户是否和厂家联系定制。芯片声音地址0x00-0xDF不是每个地址都有声音。原创 2023-02-08 11:46:39 · 1092 阅读 · 0 评论 -
arm-none-eabi-gcc编译RT-Thread nano STM32F429工程出现的问题
总结来说就是bin文件时按照地址信息顺序生成代码段和可加载数据段的文件,自定义的SDRAM段默认属性时LOAD,也就是可加载的。程序链接时将该段人为可加载的数据段链接进程序造成bin文件特别大。所以修改段的默认属性为NOLOAD(} > SDRAM。原创 2022-09-20 14:30:15 · 682 阅读 · 0 评论 -
采用arm-none-eabi-gcc交叉编译工具链 以及使用xmake构建 STM32 RT-Thread nano工程 笔记
xmake.lua 如果是其他工程拷贝过来的,可以删除.xmake文件夹和build文件夹,或者执行`xmake f -c`强制清除配置缓存,主要是.xmake缓存了上一个工程的配置信息等,会编译失原创 2022-09-19 19:33:55 · 1847 阅读 · 1 评论 -
使用xmake配合arm-none-eabi-gcc构建stm32工程
使用这种方式开发适用于所有Cortex-M的芯片,不必受限于某个芯片的专用IDE,如STM32CubeIDE只能用于STM32。所用涉及的软件全为开源免费的软件。不用编写修改Makefile,构建项目容易。可以使用任意编辑器,可以是Vscode、source insight,甚至是记事本。推荐使用Vscode,Vscode内就可以打开终端执行编译,用其他编辑器可能就要另外打开powershell或bash之类的进行编译了。由于MDK armcc工具针对性做了优化,编译出来的代码尺寸相对较小;原创 2022-08-20 15:25:37 · 2342 阅读 · 2 评论 -
使用printf进行协议调试注意事项
使用printf进行协议调试注意事项在调试协议时,使用prinf打印串口接收的数据,在使用printf调试中犯了个低级的错误数据不能这样打印:printf("%s\r\n", );这是因为printf()打印字符串时,遇到’\0’ 就会停止打印,而协议的可能存在字节为0的数据,遇到0时就停止打印会造成打印数据不全,从而误以为接收的数据不对。准确的打印的方式: for(int i = 0 ; i< msg.size; i++) printf("%02x ", msg.buf[i])原创 2022-02-18 20:04:03 · 381 阅读 · 0 评论 -
AT24C02 | WriteCycleTiming延时过短导致的读写异常问题
时序具体时间表写周期时序:从该图中可以看到在上一次Stop信号和开始信号之间需要一个时延twr从时序具体时间表可以看你出twr大小为5ms给驱动增加多字节读写1、连续多字节读写int AT24CXX_Write_Page(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite){ uint8_t i; IIC_Start(); IIC_Send_Byte(0XA0); /* 发送器件地址0XA0,写数据原创 2022-01-25 13:39:21 · 3326 阅读 · 0 评论 -
Keil STM32 不包含头文件或声明函数直接调用函数导致的异常问题
问题调用函数GetAmbientTemperature()获取返回值打印出来的很大的异常数字打印结果:解决参考:关于Keil5调用函数不包含对应头函数问题总结导致问题原因就是:没有包含对应函数头文件,编译虽然不会报错,但是读不到函数返回值。要老老实实包含头文件或者声明了函数再调用函数,,,...原创 2021-11-27 13:16:12 · 1809 阅读 · 3 评论 -
Dahlin控制算法实现
参考 :https://blog.csdn.net/yin_bu_feng/article/details/85871595大林控制算法:#ifndef _DALIN_CONTROLLER_H_#define _DALIN_CONTROLLER_H_#ifndef __API__#define __API__#endif#ifndef __STATIC_INLINE__ #define __STATIC_INLINE__ static inline#endifstruct Da原创 2021-07-30 18:43:58 · 821 阅读 · 0 评论 -
关于STM32 double类型数据计算
double PresetFlow2PVavleDuty(float presetflow){ double n[8] = { 49.2335778711886, // a 0 55.9585083556069, // b 1 -13.5915770179714, // c 2 1.54143446997669, // d 3 -0.0897576896073748,...原创 2021-07-30 18:43:16 · 3467 阅读 · 0 评论 -
STM32 编译错误记录\ARMCC\Bin\..\include\stdio.h(352): error: #20: identifier “size_t“ is undefine....
前一次编译还没有错误,做了一些改动后就编译出错。以前还出现过很多次类似的情况。 void Delay_Init(void);C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h(352): error: #20: identifier "size_t" is undefined int /*mode*/, size_t /*size*/) __attribute__((__nonnull__(1)));C:\Keil_v原创 2021-07-20 14:55:49 · 4638 阅读 · 9 评论 -
单片机 裸奔 模拟多任务调度模型 :消息队列 + 状态机 + 定时器
对于简单的嵌入式应用多数裸奔就能解决,但写出来的裸奔代码质量也由好坏之分。在网上看到了这样一篇文字:上面说到了裸奔环境下的多任务模型 - stateMachine + timerTick + Queue,也提到具体怎么做。伪代码实现//消息类型enum MessageType { MSG_USART1, MSG_USART3, MSG_20MS = 20, MSG_100MS = 100,};typedef enum MessgeType enMsgTypestMsgQueue原创 2021-01-23 12:22:25 · 3531 阅读 · 5 评论 -
OOP封装-隔离变化
封装 —— 保护程序的隐私, 不该让调用者知道的事,坚决不能暴露出来。为什么要封装隔离变化程序的隐私通常是程序最容易变化的部分,比如内部数据结构、内部使用的函数和全局变量等,需要把这些代码封装起来,从而让它们变化不会影响系统其他部分降低复杂度接口最小化是软件设计基本原则之一,最小化接口最容易被理解和使用,所以封装内部细节,只保留用户需要的最小接口。如何封装隐藏数据结构图方便直接访问数据结构的成员,容易造成模块之间紧密耦合,从而给以后的修改带来困难。内部使用的数据结构,外部原创 2021-01-14 12:07:11 · 323 阅读 · 0 评论 -
STM32 定时器输入捕获脉宽不准的问题
记录下输入捕获初始化代码#define TIM2_ARR 5000#define TIM2_PSC 72#define TIM_PSC_CLK (72000000/TIM2_PSC) //定时器计数时钟 void TIM_CaptureInit(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;原创 2020-08-27 16:33:14 · 3547 阅读 · 4 评论 -
DIY——IoT温度监控系统笔记
RTOSRT-Thread使用STM32CubeMX添加RT-ThreadMCU使用ST官方的G0板卡STM32G070RBx物联网平台阿里云IoT通信模组2G GPRS模块IDEKeil5-MDK数据使用jansson库进行json数据格式化jansson库github:https://github.com/akheron/janss...原创 2020-04-29 17:09:24 · 521 阅读 · 5 评论 -
基于事件的单片机程序设计?
基于事件的单片机程序框架?不知道这个算不算事件驱动,工作中基本是写的裸机程序,这样搞能方便程序设计,在MDK中测试OK,母鸡有没啥菜鸡如本人不自知的问题。程序从大佬程序参考修改得来。https://github.com/jiejieTop/cmd-parser代码数据结构typedef struct _event { char event_flag : 1; ...原创 2020-03-10 13:22:48 · 726 阅读 · 13 评论 -
利用__attribute__((section("name")))构建初始化函数表
在嵌入式学习工作中经常初始化一个硬件就写一个初始化函数,基本都要到主函数中调用进行初始化,main函数都要改变。当利用__attribute__((section("name")))这个属性就可以构造一个初始化函数表,这样每次初始化一个硬件啥的就不用到main函数中去调用初始化函数。式在RTT初始化函数和Linux初始化驱动模块也是类似这样做的。实现代码头文件#ifndef _HARDW...原创 2020-02-21 11:42:46 · 1264 阅读 · 0 评论 -
STM32——TIM1的TIM1_CH1N通道PWM初始化
TIM1 是 STM32 的高级定时器,功能很强大,它的每个通道都有对应的互补通道用来互补输出PWM。之前没使用过,今天要用来做 PWM 控制,花了好一番功夫才搞定。记录下初始化代码:void Led_PWM_Init(u16 arr, u32 ckCnt, u16 CCR1_Val){ uint16_t pscValue = 0; TIM_TimeBaseIni...原创 2020-02-21 11:56:42 · 16896 阅读 · 0 评论 -
学习应用笔记—STM32之ADC+DMA多通道模数转换
#ifndef _DEVICE_TEMP_H_#define _DEVICE_TEMP_H_#include "stm32f10x.h"/* 温度采集相关引脚 */#define LED_TEMP_GPIO_GRP_CLK RCC_APB2Periph_GPIOA#define LED_TEMP_GPIO_GRP GPIOA#define LED_TEM...原创 2019-11-03 16:38:21 · 4732 阅读 · 0 评论 -
STM32重映射和PWM控制
由于玩STM32的时候很少用它的重映射功能,所以做项目的时候需要PWM控制光强,用的是PB5控制。看了下手册,这不是定时器的PWM通道管脚啊,后来在硬件的提醒下才想起来STM32管脚可以重映射,都忘了这茬了。唉!真是太菜了。void LightCtrl_GPIO_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; // RCC_APB2P...原创 2019-09-24 11:25:14 · 4074 阅读 · 1 评论 -
下载程序出现"Invalid ROM Table"问题解决办法
昨晚用正点原子的阿波罗开发板烧写程序,莫名其妙就出现可 Invalid ROM Table 的问如下图所示解决办法如下:(1)先把boot0和boot1拉高(2)设置keil如下如所示(3)下载程序,完成后将boot0和boot1拉低,复位这样操作之后下载其他程序都没出现这个问题。...原创 2019-06-05 08:47:33 · 3901 阅读 · 0 评论 -
STM32三种启动模式
原文地址:https://blog.csdn.net/wwt18811707971/article/details/78678059 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。STM32上电或者复位后,代码区始终从0x00000000开始,三种启动模式...转载 2019-06-10 16:09:55 · 1104 阅读 · 0 评论 -
Keil_MDK编译程序出现错误"_use_no_semihosting was requested,but_tywrch"?
今天继续之前littleVgl GUl移植未完的工作,keil中添加了LCD、触摸屏的驱动后编译出现了**.IOBJITF TLCD_MCU.axf:Error:L6915E:Library reports error:__use_no_semihosting was requested,but_ttywrch was referenced*的error。看不懂啥意思,就只能百度了。解决办法如...原创 2019-06-14 16:29:15 · 1268 阅读 · 7 评论 -
"anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions"
打算移植下littleVgl这个GUI的,编译出现了anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions的错误,错误提示大致的意思是匿名联合只在gnu mode,或者在联合体有**#pragma anon_unions**下支持搜索了一下,在keil的官网中国找到了...原创 2019-06-06 09:28:09 · 4242 阅读 · 2 评论 -
STM32进阶之串口环形缓冲区实现
原文地址:https://blog.csdn.net/jiejiemcu/article/details/80563422STM32进阶之串口环形缓冲区实现队列的概念在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。队列的特点类...转载 2019-05-03 12:41:17 · 902 阅读 · 0 评论 -
STM32硬件错误HardFault_Handler的处理方法
原文地址:https://blog.csdn.net/electrocrazy/article/details/78173558 在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。 &n...转载 2019-04-12 18:00:18 · 1477 阅读 · 0 评论