admin管理员组

文章数量:1530842

文章目录

比较好的文章

加密

驱动开发

启动

使用CCMRAM内存

串口

网口

UDP

USB虚拟串口

在线升级

官方资源

博客资源

推荐资源

Keil使用

生成bin文件

问题分析与解决

JTAG与串口

JTAG下载程序

找不到JTAG设备

STM32 汇编

汇编中含C语言注释

数字信号处理

滤波

IIR滤波器

本人STM32开发过程中的一些心得及总结。

比较好的文章

加密

STM32MCU加密原理与方法 (很详细)

驱动开发

启动

使用CCMRAM内存

CCMRAM 为仅CPU可直接访问的内存,外设不能访问,所以像ADC、USB这些外设是不能使用的,CCMRAM的使用方法大概如下:

取消勾选 Keil --> Options for Target XXX --> Linker --> Use Memory Layout from Target Dialog ,并自定义散列文件:

; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

;LR_IROM1 0x08000000 0x00080000 { ; load region size_region

;ER_IROM1 0x08000000 0x00080000 { ; load address = execution address

LR_IROM1 0x08010000 0x00080000 { ; load region size_region

ER_IROM1 0x08010000 0x00080000 { ; load address = execution address

*.o (RESET, +First)

*(InRoot$$Sections)

.ANY (+RO)

}

RW_IRAM1 0x20000000 0x00020000 { ; RW data

.ANY (+RW +ZI)

}

RW_IRAM2 0x10000000 0x00010000 {

.ANY (CCMRAM)

}

}

在程序中,直接使用:CCMRAM a[10]={0};

串口

USART 单字节传输

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qx1wmncs-1575945336675)(//img-blog.csdn/20180322105859214?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3UwMTEzMzU2MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 “USART 单字节传输”)]

USART DMA 传输

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uiFKDIij-1575945336677)(//img-blog.csdn/20180322110035763?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3UwMTEzMzU2MTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 “USART DMA 传输”)]

网口

注意事项:

PHY芯片地址

PHY上电需复位

上传间隔不能太小,否则影响传输速度

中断组及优先级

比较好用,性能稳定的调试助手 sokit , 注意,发送数据时要选中连接。

F4以太网速度的问题

lwip_periodic_handle()函数中的TCP定时器由250ms改为2ms,速度提高了很多,但还是只有0.05M的样子

例程里面我们把发送函数放到了LWIP的轮训函数中,那个轮训函数是定时调用的,所以速度不会块,你可以把发送函数单独拿出来调用,这样速度就会快

UDP

为什么udp为什么不能发送大于1472字节数据

UDP 包的大小就应该是 1492 - IP头(20) - UDP头(8) = 1464(BYTES)

TCP 包的大小就应该是 1492 - IP头(20) - TCP头(20) = 1452(BYTES)

但是发送1400字节长度则没有问题。尝试着在lwipopts.h 或 opts.h中,把IP分片配置 IP_FRAG 和IP_REASSEMBLY两个宏定义打开以使能IP分片,还是不可以

USB虚拟串口

USB虚拟串口,单字节传输。

需要注意更改设备描述符,本人在开发过程中,遇到一个现象,ST官网提供得PC虚拟串口驱动,只能Win10使用,Win7上仅个别电脑可用,其它电脑出现黄色叹号,最终通过更改设备描述符后正常,如下面代码,将 bDeviceClass 从 0x00 改成 0x02 后正常。

/* USB Standard Device Descriptor */

__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =

{

0x12, /*bLength */

USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/

0x00, /*bcdUSB */

0x02,

// 0x00, /*bDeviceClass*/

0x02, /*bDeviceClass*/

0x00, /*bDeviceSubClass*/

0x00, /*bDeviceProtocol*/

USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/

LOBYTE(USBD_VID), /*idVendor*/

HIBYTE(USBD_VID), /*idVendor*/

LOBYTE(USBD_PID), /*idVendor*/

HIBYTE(USBD_PID), /*idVendor*/

0x00, /*bcdDevice rel. 2.00*/

0x02,

USBD_IDX_MFC_STR, /*Index of manufacturer string*/

USBD_IDX_PRODUCT_STR, /*Index of product string*/

USBD_IDX_SERIAL_STR, /*Index of serial number string*/

USBD_CFG_MAX_NUM /*bNumConfigurations*/

} ; /* USB_DeviceDescriptor */

在线升级

官方资源

在 ST 官网搜索 IAP,可找到如下 资源

STSW-STM32067 : STM32F4 in-application programming (IAP) using the USART (AN3965)

STSW-STM32069 : STM32F4x7 in-application programming (IAP) over Ethernet based on LwIP TCP/IP stack (AN3968)

X-CUBE-IAP-USART: STM32Cube in-application programming using the USART embedded software (AN4657)

博客资源

STM32 IAP在线升级教学

stm32 在线升级的惨痛经历

WiFi物联中的OTA固件升级设计原理

ISP与IAP的区别

单片机三种烧录方式ISP、IAP和ICP的区别详解

IAR环境下STM32+IAP方案的实现(转)

stm32通过485接串口做IAP :USART半双工

关于STM32的IAP与APP互相跳转

推荐资源

《STM32F429开发指南-寄存器版本_V1.1》第五十七章 串口 IAP 实验

###重要总结

IAP的升级,需要编写两个程序,一个是bootloader程序,用于启动和升级系统,这里称为IAP程序;另一个是Application应用程序,是你实际要运行的程序,这里称为APP程序。

流程大概是这样:上电后,先启动IAP程序,在IAP程序中判断是否升级标志,若是,则接收更新文件,然后进行校验无误后,写入APP地址区域(FLASH中),然后更改升级标志为否,跳转到APP执行;若否,则直接跳转到APP程序区域执行;在APP程序运行中,也可以根据接收的命令,判断是否进行升级,若升级,更改升级标志,并跳转到IAP程序。

需要注意的是,在跳转前(IAP --> APP,APP --> IAP)必须关闭所有使用的外设和中断,如网口、USB虚拟串口、ADC、DAC等等,防止升级过程中外部中断触发导致升级失败。否则,当在另一程序中开启中断时,MCU会处理之前触发的中断。ARM MDK中提供了如下两个接口来禁用(__disable_irq())和开启(__enable_irq())总中断。但使用时需注意:

__disable_irq() 只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在 __enable_irq() 开启中断后,由于相应的中断标志没有清空,因而还会触发中断。所以要想禁止所有中断,必须对逐个模块的中断进行Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过 XXX_ClearITPendingBit() 清除中断标志或者直接通过 XXX_DeInit() 来清除寄存器的状态。这样在 __enable_irq() 开启总中断后,MCU就不会响应之前触发的中断了。

在做IAP升级开发时,可以先实现IAP到APP的跳转功能,此时,对于IAP和APP分别需要进行以下设置:

首先分配FLASH的内存,大小和地址任意,但不能重叠:

IAP

加入JumpToAPP() 跳转程序;

APP

设置APP程序地址:Keil --> Options for Target XXX --> Target --> IROM1 如 0x8010000 ,并确保Keil --> Options for Target XXX --> Linker --> Use Memory Layout from Target Dialog 勾选,如果不勾选,需要自己定义散列文件(Scatter File .sct),并在散列文件中设置;

设置中断向量表偏移地址:在APP程序起始处 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x10000); ;

打开中断:紧接着上一步 __enable_irq();

添加升级协议及APP到IAP跳转程序。

然后,分别下载两个程序到板子即可。

Keil使用

生成bin文件

这里的Output目录与下面的目录一致

问题分析与解决

JTAG与串口

接上JTAG,串口发数正常,拔掉串口发数异常,帧与帧之间会多好些 FF ,网上有很多说法,有种说法是把JTAG与板子断开,而不是只拔USB。

JTAG下载程序

一次烧写程序,错将CPU上的JTAG几个引脚中的一个引脚配成其它的引脚,导致下载时提示,不能与CPU连接,于是断电重试n次,问题依旧。后来灵机一动,在点下载程序按钮的同时上电,而不是在下载程序前上电,成功!!!

找不到JTAG设备

首先检查仿真器, 设备及供电是否正常, 若均正常, 有可能是 Keil 软件设置的问题. 如某次使用 Jlink作为下载调试设备, Keil中始终发现不了JTAG设备, 而有的工程是可以的, 由此怀疑是设置问题. 后来发现将工程的 Jlink 配置文件及Debug文件删除重新配置即可, 如下图所示

STM32 汇编

汇编中含C语言注释

如果在汇编代码中使用C语言注释, Keil中编译会提示很多错误, 类似如下:

..\..\Libraries\RADAR_LIB\dsp\TransformFunctions\app_bitreversal2.S(43): error: A1163E: Unknown opcode defined(__CC_ARM) , expecting opcode or Macro

error: A1137E: Unexpected characters at end of line

..\..\Libraries\RADAR_LIB\dsp\TransformFunctions\app_bitreversal2.S(70): error: A1167E: Invalid line start

参考 这里 解决, 即在Keil的汇编编译选项 (Options for Target … --> Asm --> Misc Controls) 中加入 --cpreproc 过滤, 即可.

数字信号处理

滤波

IIR滤波器

Matlab命令窗口输入 fdatool 打开滤波器设计交互界面,按下图所示输入滤波器参数,这里设计转置直接II型的IIR滤波器。填好参数,点击 Design Filter 按钮开始设计, 设计完成后, 可以通过 Edit --> Convert Structure 转换成其它结构,如直接I型、直接II型、转置直接II型、Lattice型等等。

若想在STM32上使用该滤波器,还需要做一些转换,具体参见 STM32 官方手册中的 “Biquad Cascade IIR Filters Using a Direct Form II Transposed Structure” 小节,需要注意的是:Matlab的fdatool设计出的滤波器中的反馈系数被反转,故需要反转回来再送入STM32的 arm_biquad_cascade_df2T_f32 函数。本人写了一个转换代码,可以直接将Matlab的SOS系数转换为STM32上的格式。

%% MATLAB

% SOS is an L by 6 matrix which contains the coefficients of each

% second-order section in its rows:

% SOS = [ b01 b11 b21 1 -a11 -a21

% b02 b12 b22 1 -a12 -a22

% ...

% b0L b1L b2L 1 -a1L -a2L ]

%% STM32

% {b01, b11, b21, a11, a21, b02, b12, b22, a12, a22, ...}

%% Convert

% clear all

file = 'iircoef.c';

IIR_LEN_STR = 'IIR_LEN_MTI';

fid = fopen(file, 'w+');

fprintf(fid, ['float IIR_COEFFS[', IIR_LEN_STR, ']={\r\n']);

% for STM32, see doc

SOSO = SOS1(:, [1:3, 5:6]);

SOSO(:, 4:5) = -SOSO(:, 4:5);

[numStages, M] = size(SOSO);

for n=1:numStages

for m=1:M

fprintf(fid, '%f, ', SOSO(n, m));

end

fprintf(fid, '\r\n');

end

fprintf(fid, '};');

fclose(fid);

下面给两张结果图,分别为经过Matlab的sosfilt函数滤波后,以及经过ARM的arm_biquad_cascade_df2T_f32 函数滤波后的结果图,可见完全一致。

本文标签: 波形串口实战语言代码