自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 资源 (1)
  • 收藏
  • 关注

原创 VS2019 WPF制作OTA上位机(四)串口收发数据

因为嵌入式的设备大部分情况下是一对多通信,比如家里的空调,空调(下位机)只有一个,但是遥控(上位机)可以有多个,可以是红外遥控,可以是男主人手中的带红外功能的手机,可以是女主人手机蓝牙控制,甚至可以是插了USB控制器的PC控制。上位机发送过程:服务器将数据发送到云端,云端是通信模块的,比如移动/电信的云平台,云端将数据传给通信模块,比如NB模块(插SIM卡),通信模块接收到数据后会通过串口通知主控板有数据可取,主控板再获取数据。如果命令不正确,比如让你跳楼,你是不是应该拒绝执行,并回复命令错误(

2023-06-01 16:09:56 1927 5

原创 KEIL5.38 STM32新建工程core_cm3.h报错

网上找了很久,什么说法的都有,自己定义__INLINE的,都不行。因为我自己装的版本是5.38比较新,多了一个新的编译器版本如下图。后面才发现别人的工程魔术棒里是ARM Compiler不一样。这样导致新的编译器和旧的core_cm3不兼容。新建工程,该做的都做了后,编译发现报错。而且打开别人的工程,编译是正常的。把编译器从6降低到5,如下图。

2023-06-01 11:07:48 868 1

原创 VS2019 WPF制作OTA上位机(三)串口打开

WPF 串口打开

2023-05-29 18:04:43 1225

原创 keil生成bin文件

keil生成bin文件的方法

2023-05-17 17:27:13 493

原创 ubuntu安装好后常用软件安装和配置

1、安装vimsudo apt install vim安装好后进入路径打开vimrc文件,这里需要注意一定要用sudo不然编辑后无法保存!cd /etc/vimsudo vim vimrc在最下面加入set nuset ts=4set softtabstop=4set shiftwidth=4set expandtabset autoindent依次是显示行号设置tab宽度为4expandtab意思是用空格表示tabautoindent是自动缩进

2021-11-01 15:30:44 265

原创 嵌入式位操作

#define BIT0 (0x1 << 0)#define BIT1 (0x1 << 1)#define BIT2 (0x1 << 2)#define BIT3 (0x1 << 3)#define BIT4 (0x1 << 4)#define BIT5 (0x1 << 5)#define BIT6 (0x1 << 6)#define BIT7 (0x1 << 7)#define BIT8 (0x

2021-10-18 13:35:38 265

原创 VS2019 WPF制作OTA上位机(二)获取bin文件路径

OTA升级是通过无线通信远程把bin文件内容传输到单片机,完成升级。因此上位机需要获取bin文件的路径,读取bin文件内容,将内容分割依次发送(因为单片机的接收缓存不会开得和bin文件一样大(十几K甚至几十K))。首先在UI上添加控件,一个按钮控件Button,一个文字显示控件Lable,一个文字输入输出显示控件Textbox<Window x:Class="OTA.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200

2021-09-26 14:08:55 1326

原创 VS2019 WPF制作OTA上位机(一)新建工程

首先创建新项目,文件 -> 新建 -> 项目下拉菜单选择C#和Window,选择WPF应用程序,下一步输入项目名,下一步这里选择.NET 5.0,也可以选择其他的,个人习惯.NET,点击创建这时候出现初始界面点击运行,看是否能成功运行如果出现应用程序,则说明运行成功,即创建项目成功点击菜单栏停止按钮,停止运行程序新建工程到此结束。这里进入下一篇...

2021-09-26 10:51:14 736

原创 沁恒CH554 KEIL环境搭建

首先下载WCHISPTool_Setup.exehttp://www.wch.cn/products/CH554.html123这三个可下载的都下吧,后面开发都要用的安装好后运行,菜单栏上,功能->添加WCH MCU到KEIL器件库这时候在KEIL安装目录里面的UV4文件夹下可以看到wch.cdb的文件我的环境是keil5打补丁兼容keil4,而且之前有用比亚迪的51,所以我直接打开官方的例程,发现还是报错,没有找到CH的设备。这时候应该打开keil的配置文件TOOLS.INI修改

2021-09-13 11:42:18 4023 5

原创 航顺HK32F030MF4P6 RST作GPIO SWCLK作EXTI5 SWDIO作ADC_AIN0

老习惯,先上代码void Hw_Input_Chage_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_IOMUX, ENABLE); GPIOMUX->NRST_PIN_KEY = (uint32_t)(0x00005

2021-08-26 17:19:03 797

原创 新唐M031学习笔记(一)定时器基础计数应用

先上代码void Hw_Timer0_Init(void){ //20:100ms 200:10ms 2000:1ms 20000:100us 200000:10us TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 200000); /* Update prescale to set proper resolution. */ TIMER_SET_PRESCALE_VALUE(TIMER0, 1); /* Ena

2021-08-03 09:50:50 1719

原创 C语言代码规范(十)花里胡哨代码鉴赏

一、宏定义篇1、作者生怕读者不知道GPIO口只能赋值0或1。瞧不起谁呢。显得自己高人一等。uint8_t not_func(uint8_t sw){ return (sw?1:0);}#define LED1(sw) PA12=not_func(sw)

2021-07-22 17:28:10 952

原创 九齐NY8B072A单片机使用笔记(一)TIMER0定时器

先上代码//8bit count up , max 0xFFvoid Ny8b072a_Timer0_Init(void){ PCON1 = C_TMR0_Dis; // Disable Timer0 //1 * (255 - 5) = 250us TMR0 = 5; // Load 0x00 to TMR0 (Initial Timer0 register) //16M 2T Div8 = 1us T0MD = C_PS0_TMR0 | C_PS0_Div8 ; // Presca

2021-07-13 18:09:59 3672 2

原创 九齐NY8B072A单片机使用笔记(三)模拟串口RX

因为这款单片机没有硬件串口,所以需要我们自己做软件模拟串口。用PA3作为RX,因为PA3可以作为外部输入中断EXTI1。本人首先用轮询的方式查PA3是否从高电平跳变到低电平(起始信号),但是因为还有别的业务逻辑,导致查询到低电平的时候,不能确定此时低电平过了多少us,导致后续数据采样时间点不正确, 实时性较差。改用中断了以后问题解决。GPIO初始化代码如下void Ny8b072a_Gpio_Init(void){ AWUCON = C_PA1_Wakeup; // Enable

2021-07-13 17:55:14 3144 1

原创 九齐51单片机使用注意事项:不要用float

在使用ADC计算电压值时用了float,NY8B072A堆栈直接炸了,用32机习惯了,一直想不通,查了手册才知道。手册是:《NYC_NY8_UM_v1.5_SC.pdf》链接:https://www.nyquest.com.tw/cn/support/download/Nyquest_SW_Tools_UM

2021-07-09 09:45:30 1627

原创 九齐NY8B072A单片机使用笔记(二)TIMER1/2/3定时器

定时器1void Ny8b072a_Timer1_Init(void){ TMRH = 0; //10bit count down , max 0x3FF , higt 2bit TMR1 = 50; // Load 0xFF to TMR1 (Initial Timer1 register) low 8bit T1CR1 = C_TMR1_Reload | C_TMR1_En; // Enable Timer1, Initial value reloaded from TMR1, Non-s

2021-07-07 15:05:19 3534

原创 Ubuntu镜像下载地址

https://mirrors.aliyun.com/ubuntu-releases/用迅雷下载速度挺快的

2021-07-02 15:38:21 266

原创 中微CMS32 Keil环境搭建

打开中微官网https://www.mcu.com.cn/Products/113/pids/.html把这三个资料都下载好。环境搭建需要用的就是第三个pack包了坑爹的是pack包下载下来是.zip格式下载好后需要修改为.pack格式运行即可。

2021-07-01 11:25:26 3449 1

原创 新唐M0 KEIL环境搭建,找不到device不识别,关键:Nu-Link_Keil_Driver

公司用新唐的芯片,网上关于新唐的资料相对ST确实少得可怜,搭建环境也是搞了好久,去keil官网下载安装了新唐的pack打开官方参考工程还是提示找不到device,option里面也没有识别出来。百度了好久,尝试了各种办法,发现只要安装Nu-Link_Keil_Driver就可以了。用惯了ST有点无语。在官网https://www.nuvoton.com.cn/products/microcontrollers/arm-cortex-m0-mcus/m031-series/?group=Softwa

2021-07-01 10:14:18 3583

原创 C排序算法:(三)插入排序

像打扑克牌一样,每次摸一张牌,把牌插入正确位置。#include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length){ int i = 0, j = 0; unsigned char temp = 0; for (i = 1; i < input_length; i++) { temp = inpu

2021-06-07 16:26:57 71

原创 C排序算法:(二)冒泡排序

冒泡排序就是从左至右比较相邻的两个数值大小,如果右侧的数值较小,则交换两个数值的位置,较大的数值就会像泡泡一样一路向右漂浮。#include <stdio.h>//small to bigvoid Bubble_Sort(unsigned char *input_data, unsigned int input_length){ unsigned int i = 0, j = 0; unsigned char temp = 0; for (i = 0; i

2021-06-07 15:14:06 112

原创 C排序算法:(一)直接排序

2021-06-07 14:40:00 899

原创 visual studio 2019 未能在命名空间“System.IO.Ports”中找到类型名“SerialPort”

在vs2019以前的版本,只要using System.IO.Ports就可以用SerialPort。这里需要自己手动添加相关引用。工具–>Nuget包管理器(N)–>管理解决方案的Nuget程序包(N) –>浏览,左边搜索SerialPort右边勾选要添加的项目,点击安装。安装以后,错误就没了。...

2021-05-08 16:01:13 8039 7

原创 单片机/嵌入式软件架构分层思想

以STM32裸机开发为例。软件分层应用层驱动层硬件层固件层①最底层为固件层,Firmware这一层通常是官方给的库,库函数对寄存器进行操作,例如:/** * @brief Transmits a Data through the SPIx/I2Sx peripheral. * @param SPIx: where x can be * - 1, 2 or 3 in SPI mode * - 2 or 3 in I2S mode

2021-03-25 10:44:18 3791

原创 串口不通或乱码,排查方法

硬件问题:1、USB转串口工具有问题,换一个工具试试(用久了很容易坏的东西)2、外部晶振有问题3、单片机和外设的TX、RX连接电路上是否增加了元器件?比如0欧姆电阻。去掉以后是否能通?(遇到过一次,去掉就通了)软件问题:1、串口助手和单片机和外设三者波特率设置是否一致?字长、停止位、奇偶校验位等设置是否一致?2、波特率配置是否正确?计算公式里的单片机频率是否正确?比如原以为是72MHz的频率,实际上却是36MHz的频率,这样计算的结果来配置波特率一定是不正确的。引出第3个软件问题。3、外部晶振

2021-03-22 08:56:18 3212

原创 C语言代码规范(九)运算符优先级使用括号提高阅读性

举简单例子a = b | c << d + 2;对于大牛没有问题,对于我这样的码农需要思考一下运算优先级对于这种情况华某有规范使用括号来表示运算顺序,从而提高代码可阅读性a = b | ( c << (d + 2) );这样一目了然,大家好才是真的好。记住大神的话:代码是写给别人看的。...

2019-08-28 16:28:19 1143

原创 C学习杂记(七)extern声明可省略变量类型

工作三年,看C的书也不少。第一次知道extern可以省略变量类型。b.c有一个全局变量unsigned int data_length,a.c想要调用它,通常使用:externunsigned int data_length;在声明时可以把外部变量类型去掉:extern data_length;虽然这样使用合法,但是违背代码规范,可阅读性差,不建议这样使用。这样的使用方法与编...

2019-05-31 10:35:56 1510

原创 C学习杂记(六)%2.0f打印输出宽度

%m.nf,m表示整个浮点数的输出宽度,n表示小数输出宽度。1、printf("%f\n", 12.34); 输出为12.340000。2、printf("%2.0f\n", 12.34); 输出为12。3、printf("%2.1f\n", 12.34); 输出为12.3。4、printf("%2.2f\n", 12.34); 输出为12.34。5、p...

2019-05-17 22:06:42 2691

原创 C学习杂记(五)形参实参笔试题

大意失荆州不要以为简单就轻视,谨慎,细节,基础。一、有以下程序#include <stdio.h>typedef struct {int b, p;} A;void f(A c){ c.b += 1; c.p += 2;}void main(void){ A a = {1, 2}; f(a); printf...

2019-05-17 20:44:54 1280 1

原创 C学习杂记(四)sizeof计算联合体大小

#include <stdio.h>union u1{ char a[13]; int b;};int main(void){ printf("%d\n", sizeof(u1)); return 0;}结果为16。联合体的大小取决于它所有的成员中占用空间最大的一个成员的大小。u2最大的空间是char[13],但是因为另一个成...

2019-05-01 14:48:55 472

原创 C学习杂记(三)笔试题:字符串大小写字母切换

字符串大小写转换,大写转小写, 小写转大写#include <stdio.h>#include <string.h>int tramsform(char str[]){ int i = 0; int strLen = strlen(str); for(i = 0; i < strLen; i++) { ...

2019-05-01 14:36:39 456

原创 C语言开发笔记(八)static

在C语言中,static有3个作用:(1)在函数体,一个被声明为静态的变量在这一函数体内被调用的过程中维持其值不变。#include <stdio.h>void test(void){ static int i = 0; printf("%d\n", i++);}int main(void){ test(); test();...

2019-05-01 14:07:13 298

原创 C语言开发笔记(七)const和指针

const修饰变量是常用的,不容易犯错,而const和指针一起使用时很容易混淆。(一)const int *p#include <stdio.h>int main(void){ int a = 10; int b = 20; const int *p = &a; *p = b; return 0;}const在...

2019-05-01 13:27:34 161

原创 C语言代码规范(八)使用const修饰值不允许改变的变量

使用const限定一个变量的值不允许被改变,从而保护被修饰的东西,防止意外,提高程序的可靠性和安全性。

2019-05-01 13:11:04 660

原创 C语言代码规范(七)#define

#define 宏定义的使用#define MAX(x, y) ( ((x) > (y)) ? (x) : (y) )#define MIN(x, y) ( ((x) < (y)) ? (x) : (y) )在宏定义中要把参数用括号扩起来( ((x) > (y)) ? (x) : (y) )。因为宏只是简单的文本替换,如果不注意,很容易引起BUG。...

2019-05-01 11:53:52 641

原创 C学习杂记(二)笔试题:不使用任何中间变量如何将a、b的值进行交换

常见的方法如下void swap1(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}不使用中间变量的方法void swap2(int *a, int *b){ *a = *a + *b; *b = *a - *b; *a = *a - *b;}这种方法是不可取...

2019-05-01 11:26:04 342

原创 C语言代码规范(六)浮点型变量逻辑比较

无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用"=="或"!="与数字比较,应该设法转化成为">="或"<="形式。不建议使用的例子:if(0.0 == x)if(0.0 != x)强烈推荐的例子://EPSINON是允许的误差(精度)if(x >= -EPSINON) && (x <= EPSI...

2019-04-28 21:59:28 761

原创 C学习杂记(一)常见误会

一、sizeof是关键字,不是函数。二、strlen是函数。

2019-04-22 14:29:46 214

原创 VS2010报错 error:LINK1123:转换到COF期间失败,文件无限或损坏

右键工程-配置属性-清单工具-输入和输出,嵌入清单一项重新选择为否,如下图修改后重新生成和运行,发现程序正常运行了。

2019-04-20 15:44:25 926

原创 C语言代码规范(五)函数参数个数

一个函数的参数的数目过多(尤其是超过8个)显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度,参数越多,调用函数越慢。 参数的数目少,程序就显得精练、简洁,这有助于检查和发现程序中的错误。 如果一个函数的参数超过4个,就该考虑该函数是否编写得当。特别是嵌入式软件开发中,APCS规定的寄存器使用,R0~R3用来传递函数的参数。当参数个数超...

2019-04-18 17:17:02 7298

HK32F030Mxx_ExampleV1.0.5.rar

航顺官方参考代码

2021-08-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除