
单片机编程
快乐的老鼠
如果您觉得我的文章帮助了您,那就随手点个赞吧 :)
展开
-
获取W806的芯片唯一ID
W806没有内部唯一ID, 但是它内置1MBflash是有一个64位唯一ID的.但是很多人不知道怎么读, 下面的方法也是我问官方才问出来的#define RSA_BASE_ADDRESS RSA_BASEint readFlashUniqueId(uint8_t *id, uint8_t id_len){ uint32_t *id32 = (uint32_t *)id; if(!id || 8 != id_len){ return -1; } FLASH->CM.原创 2021-11-08 13:19:56 · 664 阅读 · 1 评论 -
FreeRTOS里的Tick定时器在哪里配置的
int main(void){ nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0); xTaskCreate(GUI_Task, "GUI_Task", configMINIMAL_STACK_SIZE * 8, NULL, tskIDLE_PRIORITY + 1, NULL); /* start scheduler */ vTaskStartScheduler(); while (1) { }}FreeRTOS10.1版本从mai.原创 2021-09-07 20:26:36 · 805 阅读 · 0 评论 -
EasyFlash 的使用感受
我的硬件是W25Q32 + STM32F401CE配置如下:/* The minimum size of flash erasure. May be a flash sector size. */#define EF_ERASE_MIN_SIZE 4096 /* @note you must define it for a value *//* the flash write granularity, unit: bit * only support 1(nor flash)原创 2021-05-31 20:56:27 · 2273 阅读 · 3 评论 -
EasyFlash 里的 EF_WRITE_GRAN
EF_WRITE_GRAN 宏是啥意思? 我若使用 W25Q32 芯片, 我该配置成啥?/* the flash write granularity, unit: bit * only support 1(nor flash)/ 8(stm32f4)/ 32(stm32f1) */#define EF_WRITE_GRAN 1 /* @note you must define it for a value */static size_t set_status(uint8原创 2021-05-30 20:41:38 · 874 阅读 · 0 评论 -
探讨 STM32F4 系列单片机 ROM 大扇区怎么存储用户数据问题
看完这个扇区地址分布内心是崩溃的,因为之前用的F1都是2KB一个扇区,每个扇区存储一个结构体,假如程序里用到5个结构体,只需要占用5个扇区即可。现在扇区最小16KB,如果将前面几个扇区作为用户存储数据区域,不可避免就得要用BootLoader了,写这个玩意要不是为了升级,真的非常没有必要,那有没有什么巧妙的方法可以不用BootLoader就能将用户数据存储在扇区1位置呢?答案是定义一个const变量,大小16KB,用at指定地址0x8004000,我现在遇到一个问题就是定义const的变量必..原创 2021-02-14 22:36:26 · 1467 阅读 · 0 评论 -
Keil 里 Astyle 的格式和效果
码代码时间久了就会发现喜欢上linux的缩进风格,无奈公司要求用C语言风格。这里先贴出两种风格的设置吧,希望以后能用上。风格一!E --style=k&r -t -j -p -k3 -W3 -n风格二!E--style=ansi-S-n-U-p-j-m0-w-s4-N...原创 2020-06-24 08:49:18 · 532 阅读 · 1 评论 -
函数形参是 void * 类型的参数传递问题
这个问题其实很常见,尤其是在一些 API 函数里。有时候想传递用户自定义类型的时候会经常有这个 void * 类型参数供用户使用。可实际怎么使用估计很多人一开始搞了半天不是提示编译错误就是编译错误。下面还是用个例子给大家简单演示下如何巧妙的将自己的参数传递过去并使用起来。...原创 2019-08-20 20:35:37 · 10285 阅读 · 0 评论 -
关于C语言中的逗号表达式你所不知道的知识解惑
首先我们要知道在C语言中,逗号表达式的优先级是最低的 (也就是说赋值运算符 '=' 都比逗号表达式优先级高)。例如:int a=(2*6,4+8,55);请问a=?答:先计算括号内的逗号表达式的值,该逗号的值为55,再把55赋值给a,所以a=55int a=5;a=(a=2*3,a*4),a+10;请问a=?很多人觉得a=34,计算方法如下:a=6,a又等于6...原创 2018-12-03 17:58:39 · 1243 阅读 · 0 评论 -
TEA加密算法Demo
#include <stdio.h>#include <stdint.h>#include <string.h>void encrypt (uint32_t v[], uint32_t k[]) { uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */ uint32_t ...原创 2018-11-26 17:45:54 · 1123 阅读 · 0 评论 -
一种简易log记录系统设计
/************************************************************** 转载时请保留博客链接地址:https://blog.youkuaiyun.com/yunjie167/article/details/84285513**************************************************************/...原创 2018-11-20 11:19:54 · 675 阅读 · 0 评论 -
%s %*s
// 在C 语言中输出等宽度的显示我们一般采用的是在前面加数字的方法, printf("%30s\n", the_text); // 右对齐输出,结果:" this is test text!" printf("%-30s\n", the_text); // 左对齐输出,结果:"this is test text! ...转载 2018-10-09 21:41:39 · 526 阅读 · 0 评论 -
RT-Thread串口驱动分析(一)
笔记2016年12月9日10:19:00串口配置在Drivers\rt_hw_uart.c->rt_hw_uart_init->rt_hw_serial_register()这里可以设置串口的工作模式,中断接收还有DMA发送.具体设置在rt_serial_init()函数里分析下串口初始化代码是怎么被调用的首先main()原创 2016-12-14 15:15:39 · 4777 阅读 · 0 评论 -
cJSON示例
{ "datastreams": [ { "id": "tempture", "datapoints": [ { "at": "2017-02-04T20:33:45", "value": 19原创 2017-02-05 20:22:45 · 962 阅读 · 0 评论 -
byte2hex
喜欢收集一些工具类,写到博客里,需要时候来看看import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;imp原创 2016-01-28 23:09:22 · 7746 阅读 · 0 评论 -
单片机编程思想之消除阻塞
本人写单片机程序也有五六年了,其实在三年前我写的程序里几乎没有 delay() 了,如果你的程序没有 delay 那么整个程序执行起来会非常的快。下面我们来分析下平时写单片机程序中所遇到的阻塞,以及解决思路。在讲之前我们的程序框架是 main 函数里先初始化,然后 while(1),前台程序是各种中断。阻塞有:按键程序判断会用到 delay 消抖,典型的消抖是 5ms。 动态显示...原创 2015-05-07 21:22:51 · 4138 阅读 · 2 评论 -
单片机编程中软件定时器
在单片机编程中,有时候需要不同步长的定时器,我之前的做法是设置各种各样的标志位,然后在while(1)里去处理,可是写着写着发现几乎每个项目里都会用到一些定时器,用之前标志位的方法写的程序看起来框架不是很好.那么就想着能不能写个简单点定时器函数呢?这是可以的,网上随便搜索就能搜到一大堆,我就当写日记了,在这里就写下,如果你们喜欢也可以参考下.首先软件定时器应用于非操作系统中,非原创 2015-04-11 22:09:13 · 991 阅读 · 2 评论 -
MSP-FET430UIF仿真器固件降级问题
公司里用了两个版本的IAR,主流是5.3版本,非主流的是6点几版本,之前在5.3版本用好好的,换到6.x版本时候会提示更新固件;仿真器的固件一旦更新了就不支持5.3版本的了,解决办法就是降级到5.3以下版本.具体怎么降级,网上有很多教程,我在这只发表我遇到的情况;第一种情况:我这边的情况是电脑上的硬件管理里能够看到MSP-FET-430UIF - CDC (COM18) (仿真原创 2017-10-21 16:03:24 · 5299 阅读 · 1 评论 -
如何快速计算出星期几
有的时候需要根据日期快速计算出星期几来,我从网上搜索到一个口诀,验证了几个日期,发现还是靠谱的,这个公式的证明目前我还不会,但可以保证2000-2099的星期计算是靠谱的,其他时间我没有验证过。const u8 month_code[][12]={ {6,2,2,5,0,3,5,1,4,6,2,4}, {5,1,2,5,0,3,5,1,4,6,2,4},};int c原创 2017-03-29 15:57:02 · 4675 阅读 · 1 评论 -
基于STM32系列的模拟串口(非阻塞式)
STM32单片机一般少则3个串口,多则5个,而我这次的项目还偏偏5个硬件串口还是不够用.至于不够用的原因,哎,是项目做到后面有定制,随便哪个串口都省不得,没得办法,只能另想法子咯~ 板子上有几个预留IO口,可以用来模拟串口. 模拟串口一般都选9600,速度最快试了也才19200,所以限制还是较多的,一般不得以情况下才会用到. 在写程序之前我也是参考了前辈们,觉得写的不咋地,照抄...原创 2018-04-03 21:50:01 · 14679 阅读 · 8 评论 -
C语言软件版本号宏定义的高级技巧
在编写程序的时候,经常会用到VERSION,用来表示程序的版本号,有的时候我们还希望里面加个日期,例如"System V2.0.1.2017.9.13"有的时候我们只想读出数字版本号,例如2, 0, 1,有的时候又想如果想将里面的2, 0, 1这3 个数字提取出来,该怎么做呢?通常做法是这样的:#define MAINVER 2#define SUBVER1 0#def原创 2017-09-13 11:30:31 · 4672 阅读 · 0 评论