stm32
一只藤井树
简单的人,做专一的事
展开
-
MCU启动异常分析记录
一.问题背景量产的产品在品质抽检中出现设备概率无法正常使用的问题,经过初步定位确定是MCU上电未正常启动。二.问题分析以及定位在产品中考虑到MCU程序升级(RF SUB-1G升级,NB-IOT等无线升级方法),因此采用的的是IAP升级架构以STM32F103为例来说明,该型号MCU FLASH起始地址0x08000000,大小512KB即 0x00080000FLASH 的ERASE是2KB。MCU的FLASH分区主要包括以下几个部分概率无法启动可能的原因:1)boot阶段异常,如启动流程卡原创 2022-03-03 20:55:52 · 7261 阅读 · 0 评论 -
FLASH操作记录
使用的单片机为GD403系列,要操作的数据flash地址位于bank1,最小操作单位为一页,即4k。下面程序演示操作一页中部分内存空间 #define LSM6DSR_BIAS_MAGIC 0xAAAA5555 uint32_t magic = LSM6DSR_BIAS_MAGIC; uint32_t *data_flash = (uint32_t *)ezbsp_RTOS_malloc(0x1000);//申请4k字节内存空间原创 2022-01-06 15:26:58 · 679 阅读 · 0 评论 -
print实现打印负数
最近在使用的一颗8位单片机,不支持sprint的相关库,负数的打印需要自己实现,在此记录一下相关代码void tem_print(uchar *str,int value){ if(value >= 0) { *(str+4) = '0'; *(str+5) = value/10000+'0'; *(str+6) = value%10000/1000+'0'; *(str+7) = value%1000/100+'0'; *(str+8) =原创 2021-12-03 15:10:01 · 1294 阅读 · 0 评论 -
串口接收处理--非中断方式
最近使用的一个传感器,在上电后1s内可以读id,之后就会自动转为持续检测模式。因此在初始化时对传感器进行获取ID的操作。获取id时接收选择轮询模式接收函数: int recv_cmd(uint32_t usart_periph,uint8_t *buf,uint8_t size){ uint32_t rcvdelay = 50000; if (NULL == buf) { vDebugPrintf(printf_ERR,"{%s} buf point is null\r\n",__func_原创 2021-11-09 10:15:21 · 1156 阅读 · 0 评论 -
定时器使用总结
gd32定时器使用总结 本次项目中较多模块使用了定时器,对定时器的不同使用方法进行总结补充。模块一: 回充红外 通过定时器的计数器模块记录红外发射出来的脉冲宽度void ir_timer_init(uint16_t prescaler, uint16_t period){ timer_parameter_struct TIMER_PARAMETER_STRUCTURE; rcu_periph_clock_enable(IR_TIMER_CLK); timer_deinit(IR_T原创 2021-08-25 14:27:36 · 995 阅读 · 0 评论 -
一个滑动窗口类型的应用
函数说明:近期项目中需要对采集的一些adc值进行滤波处理,采集100个值,取平均值给出。类以一个队列,进一个新值出一个旧值,保证最终给出的数据平滑。#define 100static int ezbsp_Sidebrush_adc_filter(uint16_t *data, uint8_t clear){ static uint8_t count = 0; uint32_t sum = 0; static uint16_t filter_data[FILTER_NUM+1] = {0};原创 2021-04-14 15:55:46 · 119 阅读 · 0 评论 -
pwm控制电机原理
首先我们要明白电机的原理电机 简单来说就是 实现电能与机械能相互转换的电工设备那么我们经常使用的直流电机原理就是:电生磁:通电导线会产生磁场也就是电磁感应 旋转磁场带动转子转动。电动机是由定子和转子组成,一个产生旋转磁场,一个为磁极,电机的转子(轴承)就转起来了。这便实现了 电能->磁能->机械能的转换下面两个图可以更直观的理解:那么关于电机我们不做深究,我们只需要知道,电机的本质,就是线圈 也就是电感元件同时我们知道电感有防止电流突变的作用关于PWM的原理请参照这篇博转载 2021-04-06 11:34:52 · 9182 阅读 · 1 评论 -
一个小巧开源的事件驱动模型按键驱动
MultiButton MultiButton,一个小巧简单易用的事件驱动型按键驱动模块,作者 0x1abin,目前收获 222 个star,遵循 MIT 开源许可。这个项目非常精简,只有两个文件,可无限量扩展按键,按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。如何移植应用可参考这篇博文,讲解的很详细易懂移植链接https://mculover666.blog.csdn.net/article/details/104992661...原创 2021-03-02 15:38:51 · 269 阅读 · 0 评论 -
回调函数简单使用
一、回调函数是什么,我们为什么要用它? *回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数* 用一段简单代码来理解一下#include<stdio.h>#include<softwareLib.h> // 包含Library Function所在读得Software library库的头文件int Callback() // 回调函数{ // T原创 2021-02-25 21:01:33 · 2232 阅读 · 3 评论 -
RTOS中使用看门狗
RTOS中使用看门狗查看了网上很多关于如何在RTOS中使用看门狗的策略,其实每种策略都有其使用场景,下面主要提到的几种方式。• 1、建立一个看门狗的定时任务,并将该任务定义为最低优先级。这种方式需要保证看门狗定时器的溢出时间一般要足够长,且单片机不是经常满负荷运行。(保证CPU的使用权不是一直被高优先级的线程抢占)• 2、建立一个看门狗的定时任务,并将该任务定义为最高优先级。这种方式保证了喂狗的及时性,但是如果只有低优先级的任务死了(经历少,倒是没遇到过),这种方式下的看门狗就起不到作用。• 3原创 2021-02-21 09:52:18 · 1007 阅读 · 0 评论 -
容易让单片机程序跑飞的原因
1、意外中断是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。2、中断变量处理不妥若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile;其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断,否则出现造成数据乱套。3、地址溢出,常见错误为...原创 2020-03-26 16:32:30 · 976 阅读 · 0 评论 -
C语言-结构体面向对象编程技巧
Keil4 C51工程网址:https://yunpan.360.cn/surl_yrNkQSrCKyc一、面向对象面向对象是软件开发方法,是相对于面向过程来讲的。通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式单片机C语言的面向对象编程,是利用结构体,将变量、指针、函数等进行封装,达到编程更加方便、程序可读性更好、方便移植等目的。二、知...转载 2020-03-23 17:46:34 · 1371 阅读 · 0 评论 -
SQL常用语句
总结下简单常用的SQL语句,方便查看数据。1、查找 表 a; select *from a;2、查找表a的num: select b.num from a b;3、查找表a的num的平均值 :select avg(b.num) from a b; //总和、最大值、最小值同理 sum max min4、查找表a中num小于1000的记录 select from a where...原创 2019-12-02 21:32:51 · 586 阅读 · 2 评论 -
gprs数据传输流程
一、最近的项目中用到了GSM模块,总结一下,模块型号是SIM800C,mcu还是stm32rtc6。1、首先了解一下专业术语SIM–用户识别码GPRS–General Packet Radio Service, 通用分组无线电业务。GPRS是一种新的GSM数据业务,它可以给移动用户提供无线分组数据接入服务。GPRS主要是在移动用户和远端的数据网络(如支持TCP/IP、X.25等网络)之间提供...原创 2019-09-06 15:57:14 · 3448 阅读 · 0 评论