概述
Code:表示程序所占用 FLASH 的大小(FLASH)。
RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。
RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM)
ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM)
想了解具体stm32存储分配结果的,看我这篇文章,嵌入式处理器(单片机)启动文件学习(汇编)笔记,DCD和SPACE区别,全局变量,局部变量,程序的栈
* 库函数版本跑马灯工程编译后10KB flash+ 2KB ram 因为参杂了库函数的太多太多一点儿相关性的无用代码
寄存器版本2KB flash + 2KB ram,编译速度快很多,代码量和.c文件只有几个,而且代码结构简洁清晰
所以,我还是喜欢寄存器开发方式
*锁相环有三种时钟源,外部晶振(一般25MHZ),内部IRC时钟16Mhz,内部32KHZ时钟,都可以倍频后到任意主频,但是400MHZ最大稳定频率了,据说再高就会死机。其中init函数有三个设置点,几个分频倍频因子用于设置主频和外设的频率。
*中断函数里面处理的内容尽可能的少才行,就更新一些flag状态变量和接收缓存数据等等,大部分处理任务都交给主函数的while里面处理
*mpu是内存保护单元,用于保护某些地址快的存储区不能被改写,比如外扩sdram的存储区域不能让系统分配变量到那儿去,因为这块区域我们有自己的专门用途
*正点原子的usmart调试功能原理:
先在程序里面做一个(void*)delay_ms,"void delay_ms(u16 nms)"待调用的所有函数地址和每一个字符串的映射关系表
比如这样
struct _m_usmart_nametab usmart_nametab[]=
{
#if USMART_USE_WRFUNS==1 //如果使能了读写操作
(void*)read_addr,"u32 read_addr(u32 addr)",
(void*)write_addr,"void write_addr(u32 addr,u32 val)",
#endif
(void*)delay_ms,"void delay_ms(u16 nms)",
(void*)delay_us,"void delay_us(u32 nus)",
(void*)LCD_Clear,"void LCD_Clear(u16 Color)",
(void*)LCD_Fill,"void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)",
.......
然后我们用串口助手传输一个字符串过来,单片机程序就会对比这个字符串和表里面的字符串对应上了,然后提取出字符串里面的实参内容等等,然后也就找到了这个函数的地址和参数内容,然后我们程序就可以调用该函数了
调用过程是这样:
case 0://无参数(void类型)
res=(*(u32(*)())usmart_dev.funs[id].func)();
break;
case 1://有1个参数
res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
break;
这里的usmart_dev.funs[id].func)()就是其中的一个待执行函数的地址,这样就实现了用串口指定单片机程序里面执行哪个函数的功能
优点:原理简单明了,想看看哪个函数执行效果的时候,不用每次都在单片机程序里调用然后编译下载进去执行,可以直接串口指定执行了,加快了程序调试速度和减少了频繁烧录flash
缺点:暂时没想到,非要说缺点那就是增加了.c文件的个数和增大了程序代码量
难点:串口发送过去的都是字符串,所以单片机程序里面得解析出这个字符串里面的实参内容,个数,符不符合规范以及返回提示性错误,总的来说就是字符串解析是难点。
*DMA的原理以及使用:
可以实现内存→内存、内存→外设、外设→内存之间的机械化高速数据传输,而不需要cpu的干预,从而不会消耗cpu运算性能
传输完成后,要么通过中断函数的方式通知cpu,要么cpu通过不断查询if(DMA2->HISR&(1<<27)) //等待DMA2_Steam7传输完成,这个寄存器的某个位的方式知道此时的是否传输完成,pro=DMA2_Stream7->NDTR; //得到当前还剩余多少个数据,查询这个位可以得到传输进度
举例:以单片机串口发送数据给电脑(原理:cpu发送一个数组里面的数据给串口外设,然后这个外设发送数据到电脑串口)为例,分析可知,实际上从这个数组(内存)里面数据不断搬运到串口外设的过程是一个机械化过程,我们使用DMA发送即可:
MYDMA_Config(DMA2_Stream7,42,(u32)&USART1->TDR,(u32)SendBuff,SEND_BUF_SIZE);//DMA2,STEAM7,CH42,外设为串口1,存储器为SendBuff,长度为:SEND_BUF_SIZE.
然后
USART1->CR3=1<<7; //使能串口1的DMA发送,也就是说外设串口(还是在单片机内部的,学过fpga都知道单片机内部结构就是cpu通过通信总线和各种外设相连) 一旦被填满了数据,就能立即发送了
MYDMA_Enable(DMA2_Stream7,SEND_BUF_SIZE);
//开始一次DMA传输!这样就会自动进行数据搬运了,而 串口一旦被填满了数据,就能立即发送了,这就实现了这个自动的过程
最后
以上就是搞怪星星为你收集整理的stm32h743单片机嵌入式学习笔记1-,DMA的全部内容,希望文章能够帮你解决stm32h743单片机嵌入式学习笔记1-,DMA所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复