《STM32调试经验.docx》由会员分享,可在线阅读,更多相关《STM32调试经验.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品word 可编辑资料 - - - - - - - - - - - - -PVD/ 可编程电压检测器1. Lib 中加入 stm32f10x_pwr.c 和 bkp.c 文件;2. 去掉 conf.h 中的两个注释3. 开启时钟APB1 的 BKP和 PWR4. PVD的中断时位于EXTI16上的外部中断5. 详细步骤: 缺省值设置, 清中断标志位, 挑选中断线路, 模式, 触发方式, 线路使能, 初始化结构体,后备寄存器操作使能,设置电压的阀值,使能PVD6. 中断的优先级举荐挑选抢占最高级7. PVD中断中储存的数据量和供电的电源上的电容大小有肯定关系;SPI/ 串行外设接口1. 加入
2、spi.c 文件 ,去掉 conf.h 中的两个注释2. 开启时钟APB2(SPI1,)开启端口复用3. 配置 SPI的 MISO,MOSI,Clock,NSS复( 用推挽输出,浮空输入,NSS挑选软件模式不需要配置,但是模块的NSS仍是需要设置的)4. 用开发板的话,需要失能其他不用的SPI模块,防止显现问题;5. 结构体数组初始化,模式,极性,相位,校验,等等;6. SPI 的发送和接收,SPI读数据需要发送任意数据才能读;(缘由是主设备供应时钟)7. SPI 的NSS 引脚在硬件模式下可输入可输出,设置主模式输出模式的时候需要SPI_SSOutputCmd(SPI1, ENABLE);8
3、.(16.6.14)SPI不用中断的发送接收函数测试:SPI是全双工,读写分别有数据线,共用 SCK时钟,写,读是同步进行,不过操作详细芯片的时候,返回值要依据芯片的 datasheet 操作;所以一般读的时候都需要写数据启动时钟;9. (16.7.27)用 IO 口模拟时序的时候,MOSI 和 MISO 的初始化引脚置高2021/3/11. B 码程序 MAX485 在无输入信号的情形下,输出保持高电平;2. 定时器输入捕获的时候,捕获上升沿时 ,捕获引脚设置为下拉输入;3. 上拉输入:外部无信号输入时,引脚电平保持高电平(比如I2C)4. 在定时器输入捕获时,捕获引脚设置成浮空输入的话,引
4、脚电平状态是不稳固的,有波动2021/3/30I2C1. STM32 的硬件I2C 模块不稳固,使用软件模拟时序的方式使用I2C 模块,硬件I2C存在 Bug.2. FATFS32的 MP3 程序在支持中文文件名之后存在目录读取英文文件名失败的现象, 此问题未解决(已解决,指针地址没有回送);2021/4/5CAN1. 在设置一个寄存器之前,相应的位先清空,再设置;第 1 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -2. CAN 总线告一段落,设置CAN 总线 CAN_InitTypeDef (设置工作模式
5、,波特率)和CAN_FilterInitTypeDef(设置屏蔽滤波器) ;3. 设置发送报文的ID 格式, IDE, RTR,数据等参数CanTxMsg 和 CanRxMsg ;4. 相应的中断; 屏蔽过滤寄存器关联FIFO,FIFO0 时是 USB_LP_CAN1_RX0_IRQHandle;rFIFO1 时是 CAN1_RX1_IRQHandler;2021/4/5中断1 Stm32f10x_it.c 中的中断名称是在 startup_stm32f10x_hd.s中查找添加;2 NVIC 组治理中的中断通道名称是在stm32f10x_it.h 中查找添加;2021/4/13Systick
6、 和 TFT触摸屏1. systick 在设置成1us 中断时,简单显现问题,详细的等液晶触摸屏功能实现后再测试;2. TFT 触摸屏使用SPI通信时, SPI 的频率挑选速度太快(8 分频)时,高电平的时间达不到 200ns,会丢失数据;3. 等差数列中位数(a0+an) /24. 触摸屏使用中断法画点的时候,显现描点特别慢的现象;解决:由于串口不停的在打印消息占用中断资源,在描点的时候不要打印5. 液晶取模软件的使用,字模 3 和 LCD2002完善版, 取模的方式不同,字模 3 是整体取模,但是LCD是每个字单独取模,所以编程上不同;2021.8.42021/4/23定时器推迟函数1.定
7、时器更新标志位放在结构体初始化前清空标志位2021/4/25Modbus之 CRC校验1. 串口发送数据时或者检测定时器更新大事时,通过读SR的相应标志位保证发送或者大事的发生;2. Modbus 的 CRC16校验在发送时是低 8 位在前,高8 位在后;3. 留意运算符的优先级问题;4. 对于 memcpy( 目标数组,源数组,个数);5. A.b:c如 A 为真,就表达式b;如 B 为假,就表达式C2021/4/27SD response ,数据地址第 2 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -1
8、. Some SDs command have response, their saved in SDIO_RESPx register.2. When writethe addresss data, if address=0, Data width is 4.So when you writein the address 3, you should be 3*4=12 , Use 12 replace 3.Example: Address 0use 0 1 2 3, Address1use 4 5 6 7 ,Address2head address= 2*4=8 9 10 11.Exampl
9、e: Sector * block size上面是应用在字节一一对应3. normalu16 a=1,2,3;a 的地址假如是m ,那么 a1 的地址就是m+2 u32 的数组就是m+4 u8的数组就是m+12021/4/28SPI1. SPI的接收寄存器SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;/ 没有数据传输的时候,时钟保持低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; / 在第一个时钟边沿处理数据2021/4/291.外部中断模式的挑选,挑选是中断模式仍是大事模式2021/5/51. 平 年 闰 年
10、 判 断 if(timesVal5%400=0)|(timesVal5%4=0)&(timesVal5%100.=0) /假如为闰年DaysOfMouth1=29;elseDaysOfMouth1=28;2021/5/13中断一. 电平同时变化1. 中断上下边沿的时间间隔1us 时; (即高电平保持1us)结论:丢失STM32 外部中断比如,EXTI95的中断,挑选PB6,PB7 作为外部中断输入,假如外部中断同时来的话,比如:先下降后上升,第一个边沿都能进中断函数,并且依据函数次序处理(只进一次中断), 但是,当其次个边沿来时会丢失函数次序靠后的中断线函数;2. 中断上下边沿的时间间隔1ms
11、 时 (即高电平保持1ms)结论:不丢失STM32 外部中断线都能很好的进入相应的中断处理函数,比如Line6 与 Line7 都可以相应的判定处理;前提是中断处理函数中的程序小于1ms3.一般在编程的时候中断中函数用systick 运算时间; Systick 的 us 级中断使用时, 在 systick 中断函数中的程序就不能超过1us 否就死中断了;4.外部中断设置上下降沿双触发时,触发上升沿后再触发下降沿时,STM32 内核可能需要时间设置,所以假如脉冲边沿间隔时间太短简单丢失,1us 会丢失;第 3 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 -
12、- - - - - - - - - - - -二. 电平单独线路中断1.单个中断线的中断,当中断处理函数执行时间t 大于电平跳变时间t2 时,假如设置捕获上升下降跳变中断t2 的下降 (或上升 )沿中断会丢失;三. STM32 的中断与大事产生中断肯定产生大事,大事不行屏蔽,中断可以屏蔽2021/5/18串口不用microLib的打印1. 不用 microLib 的 printf 函数,自己的版本需要改写;原子的源码和自己写的串口初始化程序有点问题, fput 需要改动待测的标志位;2021/7/2LWIP 源码无法PING通对应 GPIO 口需要改写,在初始化的时候,特别是复位口,仍有片选口
13、,肯定需要给确定的状态,在移植时,源码的片选操作端口也要对应的改2021/7/41.LWIP 源码网页无法打开2.LWIP 网页无法刷新1. 数据包发送函数调用的写buff 函数时序规律错误和datasheet 不相符合 (多加了一句空指令);2. 发送函数的计数初值类型u8 过小,实际为u16 ,网页实质已经刷新,但是前256 个数据一样,所以造成没有刷新的假象;2021/7/14 2021/7/29nrf24l01 调试体会1. 串口调试助手,在选HEX 发送时,发0x01 时,只要输入01发送就是0x012. 在调试的时候, 特别是调试开发板的时候,肯定需要检查板子上一些模块可能共用的总
14、线有干扰3. STM32 在上电后只要是没有初始化的端口,GPIO 的属性都是低电平4. 51 单片机上电后只要是没有给初值的端口,IO 口都是高电平5. NRF24L01 工作在增强型shockburst模式时, 发送和接收模式都需要设置自动重发功能,增强型比一般型更加牢靠,有应答和自动重发的功能;6. 操作新的模块时肯定需要把工作模式和寄存器的配置弄清晰7. 在头文件里定义数组的时候,需要加static 否就,在放在STM32f10x.h 一起包含的时候,会显现重复定义;函数声明放在.h 中就不会显现;8. 在配置无线模块地址时,地址宽度P0, P1 的地址最长5 位,模块先写地址低字节,
15、P1-P5 的地址只有最低位可以设置;9. 自动应答模式和自动重发关闭时,实测速率可达64KB/s,自动应答模式下速率40KB/s.10. 只有 P0 地址可以接受自动应答,而且发送端发送地址等于接收地址;STM32 下载完有变化的程序后,假如显现没有变化,那么断电再开;前一次和后一次外设时钟关闭有可能没关掉,得重启2021/8/31STM32 的 I2C第 4 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -一. C语言编程函数1. Strstr(str1 , str2 )strstr(str1,str2)函
16、数用于判定字符串str2 是否是 str1 的子串;假如是,就该函数返回str2 在 str1 中首次显现的地址;否就,返回NULL;char *strcpy(char* dest, const char *src);说明: src 和 dest 所指内存区域不行以重叠且dest 必需有足够的空间来容纳src 的字符串;返回指向 dest 的指针;2. abs(int i)求肯定值3. sqrt(a), a=0开平方4. int sprintf( char *buffer,const char *format, argument);将 String:%sn强制转换写入到buffer200 的数
17、组并且%s 处 已经用 s替换成 ”computer ”charbuffer200,s = computer ; sprintf( buffer, String:%sn, s );返回值是写入buffer的字符数;5. 高级宏应用1. #definemyprintf(.)printf(lch:File:%s, Line:%d, Function:%s, VA_ARGS , FILE , LINE , FUNCTION );宏定义 myprintf() 中的省略号会原样的替换在并且 VA_ARGS_只_能等于常量;2.#, # VA_ARGS_处_ ;#代表与一个字符串连接/ #n就是以n的字符
18、串#代表与符号连接,可以是宏符号,或者是变量/#n就是和#左边的参数直接连接比如a#5就是 a5例#definen 8+9第 5 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -#definenn 123#definemm(n)printf( 这是一个测试 #n 测试 %d, #nn)3. #definePDEBUG ( fmt , args.)printk( KERN_DEBUGscull: fmt,# args)宏定义中的省略号表示一串可变的参数例, 这一串参数可用args 加以引用.PDEBUG( a=%
19、d, b=%d, a , b );宏绽开printk( KERN_DEBUGscull: a=%d, b=%d, a , b );4. 字节内存填充的问题_packed 关键词是编译器语言typedef packedstruct packed 表示此结构体成员变量不进行内存填充,优点是便利指针读数据,缺点是不便利CPU操作比如:typedef structtypedef packed structchar x;char x;int y;int y;struct1;struct2;在 32 位的 ARM SDT 编译器中,编译sizeof(struct1)=8,char x;会在 x 后面填充
20、3 个字节sizeof(struct2)=55. assert(n.=0);或者ASSERT(n.=0) 参数检查,程序判定n 不能等于0,否就报错System(pause);系统暂停程序,会打印“按任意键连续”6. 1 ul定义 1 是 unsigned long 型数据,同理1u 代表定义为unsigned int型7. sizeof(数组名 )求占用空间长度8. intstrncmp(str1, str2, n)比较前 n 个 str1 和 str2 的 ASCII码值,相等返回0, 如 s1s2,返回大于0 的值, s1s2,返回小于0 的值;Int strcmp(const char
21、*s1, const char *s2)当 s1s2 时,返回正数;9. 函数指针第 6 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -Void showNum(int n, void (*ptr)() );Void (*ptr)() 这里是声明白一个void 类型的函数指针变量ptr ;这里的 ptr 需要用括号括起来void 代表无返回值,但是去掉括号就会有歧义纷乱;所以函数指针肯定要用括号括起来;10. 联合体:几个不同的变量共同占用一段内存的结构;单片机中常常会遇见分别高低字节的操作,比如进行计时中断
22、复位操作时往往会进行(65535-200)/256,(65535-200)%256这样的操作,而一个除法消耗四个机器周期,取余也需要进行一些列复杂的运算,假如在短时间内需要进行许多次这样的运算无疑会给程序带来庞大的负担;其实 进行这些操作的时候我们需要的仅仅是高低字节的数据分别而已,这样利用联合体我们很简单降低这部分开销;代码:union chufaint n;/n 中存放要进行分别高低字节的数据char a2;/ 在 keil c 中一个整形占两个字节,char 占一个字节,所以n 与数组 a 占的字节数相同test;test.n=65535-200; / 进行完这句后就一切ok 了,下面通
23、过拜访test 中数组 a 的数据来取出高低字节的数据TH1=test.a0;/test.a0中储备的是高位数据,这是由于keil 的特性,假如其他编译器仍请自测TL1=test.a1;/test.a1 中储存了test.n 的低位数据.thats good, 仅仅用了一条减法指令就达到了除法、取余的操作,在进行高频率定时时尤为有用;第 7 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -11. C 语言中四种储备类别C 语言中变量的声明/定义格式如下:储备类型类型修饰符数据类型变量名 ; Staticlong
24、 、constint 、charaaStatic 变量(静态)( 1)限制作用域; 利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担忧命名冲突;( 2)静态储备区,类似全局变量,变量的内存只安排一次,但是仍旧有(1)中的作用;( 3)static 和全局变量一样初始化默认值为0;( 4) static 申明局部变量,当其次次进入子函数时,会将上次变量结果值赋给变量Extern (静态)Auto(动态)即局部变量,非全局变量的缺省值假定为auto;故基本不用; Register(动态)把变量优先放在寄存器中操作,提高速度,不常用;const常量,数值不行以更换volatile每次取
25、值必需读内存code 在 STM32 中是把内容放在片上flash12. 负数 =正数取反 +113. C 语言中程序运行时具有以下几个储备空间(大体上分成数据区和代码区)静态储备区:静态数据、全局变量和常量栈区:局部变量(终止自动释放)堆区:动态安排内存(malloc , calloc,free )_msize(void* p)得到 malloc 安排的内存大小代码区:存放代码文字常量区:常量定义的字符串函数指针指向:代码区第 8 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -数据指针指向:堆,栈,数据储备
26、区14. Program Size: Code=8044RO-data=52RW-data=56ZI-data=5184Code 指储备到flash【Rom 】中的程序代码,代码被系统添加了一部分初始化ZI 的代码,编程者看不到这部分;ZI 英语是 zero initial ,就是程序中用到的,并且被系统初始化为0 的变量的字节数,keil 编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是储存在RAM 中的RW 是可读可写变量,就是初始化时候就已经赋值了的,RW + ZI 就是你的程序总共使用的RAM 字节数;RO,这个是初始化的常量,但是这些值是被储存到Rom 中的,就放
27、在主程序后面,这样所写的程 序占用的rom 的字节总数就是Code + RO + RW ;为什么 Rom 中仍要存 RW ,仍有 ZI 函数呢,由于掉电后 RAM中全部数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值 就是储备在Rom 中的;15. 回调函数一般形式Typedefvoid (*cbShow)(intn);void ShowNum(cbShow pFun, intn) pFun(n); /showNum就是一个回调函数void PrintNum(intn)printf(Test1 is called,the number is %dn,n);主函数中ShowN
28、um( PrintNum,11111) ;16. void *memset(void *s, int ch, size_t n);函数说明:将s 中前 n 个字节(typedef unsigned int size_t)用ch 替换并返回指向s 的指针;memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;17. htonl() 函数字节次序转换为网络字节次序,即转变大小尾格式18. strlen()求字符串长度不包含019. 处理字符串尾部要加020. 对于短小函数的实现,C 中是宏定义C+ 中是内联函数第 9 页,共 12 页 - - -
29、- - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -21. 内存中的地址都是字节unsigned long *p2; p2=(unsigned long *)0x810000; p2+5 = 0x81001422. sizeof 如用于数组,只能测出静态数组的大小,无法检测动态安排的或外部数组大小;23. 指针Char const * p = const char* p读出数据是常量,函数指针能够对任意地址进行只读操作 Char* const p函数指针是常量,只能对固定的位置进行读写操作int (*p)n/ 数组指针,初始化例子:int ax
30、n;(*p)n=a;定义一个行指针,并指向二维数组的第0 行int * pn/ 指针数组24. 无限循环u8i;for(i=0;i=255;i+)当 i 执行到 255 时, i 会 255+1=0 ,就无限循环25. 系统暂停引入头文件 ” stdlib.h” System( pause );/按任意键连续26. 使用循环肯定要留意再次循环时的相关参数是否需要复位27.随机数srand(u16)time(NULL);下种子rand()%N生成 0 N-1 的随机数28. 字符的表示对于无符号数来说,字符”-1”= 0xff = 0-1= -129. C 语言数组从0 开头,循环处要特别当心3
31、0. 柔性数组,静态链表中使用了柔性数组31.Char a= 1; Void p(char * m);函数调用 P(a)sizeof(a) = 4 ; /这里子函数求得是指针的大小第 10 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -常用算法详细相关算法实现练习见VS2021 的 test 项目 tat.c 练习1. 4 字节对齐算法defineMEM_ALIGNMENT4( (size) + MEM_ALIGNMENT- 1)&(MEM_ALIGNMENT-1) )2. 冒泡法排序3. 两分法定位一般都是
32、先排序,然后用两分法排序HTML调试体会1. 提倡全部对属性值加双引号(参数值为数字除外);(颜色用 rgb 时也不例外)例: 被设置的内容 2. 下划线假如是标签中需要设置属性的话,那/ 放在最末尾3. URL(Uniform Resource Locator)中文名字为“统一资源定位器”;4. 表单,是 HTML页面与浏览器端实现交互的重要手段;第 11 页,共 12 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -PQM09 调试1. DSP 下载程序 (XP 系统 ),选型号 (初次 ),选程序,有的需要解锁(密码 );详细:连接好后,先设备上电,然后再开软件连接;2. 设备接线 (电压电流调试线),三相台参数设置,台式机软件启动配置参数,外表, 下载增益后,设备上电3. 调剂无功功率需要,发送电流每相加90 度4. 调剂有功和正向无功,P0 时需要 0.5L (感性电阻电压超前于电流),然后 0. 5C(容性电阻,电压滞后于电流) ,最终调剂相角选1.0,然后电压夹角,最终看设备电压不平稳度要%1ERP 流程1. 车间生产一概下生产订单,生产需要出库需要生产订单;研发除外;第 12 页,共 12 页 - - - - - - - - - -