平台:stm32f103zet6
flash:内置512K(大容量)
sram:内置64K+外部512K
启动文件:startup_stm32f10x_hdc
链接脚本:stm32f10x_flash_extsramld
1、没用ucos iii之前是可以正常运行的,
2、用了ucos iii之后不能正常运行,
ucosiii是能在KEIL UV4上成功运行的,初步怀疑是堆和栈的分配有问题(因为ucosiii中要用malloc动态分配内存),所以我想知道stm32是如何获取堆和栈的信息的,我怎么才能让它知道堆和栈的大小以及地址空间。
补充:栈的最高地址可以通过启动文件的下面部分知道,即stm32启动之后先要从flash的起始处取出栈的最高地址和复位向量,那堆是怎么知道的呢,我不知道IDE在这方面是怎么处理的,我想充分利用内置64K+外部512K的SRAM,不知道怎么做,谢谢
void ( const g_pfnVectors[])(void) =
{
(void )Initial_spTop, / The initial stack pointer /
Reset_Handler, / Reset Handler /
NMI_Handler, / NMI Handler /
HardFault_Handler, / Hard Fault Handler /
}
假设你要读取的数据位于Flash地址0x08001000处,使用如下代码读取:
数据为8位: char val=((volatile char )(0x08001000));
数据为16位:short val=((volatile short )(0x08001000));
数据为32位:int val=((volatile int )(0x08001000));
读取数据的本质是将绝对地址转化为相应指针,然后取指针指向位置的数据。
STM32每一个芯片内部都有一个唯一的96位的ID号,可以通关过以下方式进行读取:
由于唯一ID是一个96位的数据,所以你要创建3个32位变量用于存储ID号
static u32 CpuID[3];
接着执行读取函:
void GetLockCode(void)
{
//获取CPU唯一ID
CpuID[0]=(vu32)(0x1ffff7e8);
CpuID[1]=(vu32)(0x1ffff7ec);
CpuID[2]=(vu32)(0x1ffff7f0);
}
数就可以了。
把自己写的html网页加到工程中有两种方式:
1
你系统已经移植了文件系统,那么PC端编辑好的html文件就可以直接存放在SD卡之类的地方然后STM32通过文件系统的API读出html文件。web端只负责把这个文件读出,送到客户端。客户端的浏览器会负责解析。
2
另外一种就是没文件系统,那么你只能把html文件转成二进制数据存入内部的FLASH或者是SD之类的存储器介质中。然后按照事先制定的规约读取发送给客户端
我就直接用注释的方式写了
void KEY_get(void){
unsigned char i;
unsigned int temp;
temp = ~((GPIOA->IDR & 0x8000) | ((GPIOC->IDR & 0x1C00) << 2) | ((GPIOB->IDR & 0x300) << 2)
| ((GPIOB->IDR & 0x30) << 4) | (GPIOD->IDR & 0xff));
//上面是获取ABCD四个IO口对应管脚的输入情况,就是确认那些脚是不是输入模式
for(i=0;i<16;i++)
{
if( temp & key_list[i] )//与key_list里面的值对照,找到匹配的脚进入if
{
if(key_time[i]==3) //这个是按下时间的判断
{
key_short |= key_list[i]; //key_list[i]对应的这个按键被短按
}
if(key_time[i]>651) key_long |= key_list[i];//key_list[i]对应的这个按键被长按
else key_time[i]++;//按键计时,来确定按了多久
//如果按键释放了,就退出if( temp & key_list[i] ),
//如果时间短的话可能只是执行了if(key_time[i]==3),
//而if(key_time[i]>651)就不满足就不能执行
}
else //如果没有找到匹配的按键就执行下面代码(因为这个else是和if( temp & key_list[i] )匹配的)
{
key_time[i] = 0;//按键计时清零
key_short &= ~key_list[i];//清除key_list[i]短按状态
key_long &= ~key_list[i];//清除key_list[i]长按状态
}
}
}
最后应该还有一个程序来读取key_short和key_long来确定按键的状态吧
以上就是关于stm32是怎么获取堆和栈大小的+ucos iii全部的内容,包括:stm32是怎么获取堆和栈大小的+ucos iii、如何读取stm32 flash里面的内容、如何获得stm32 cpu的唯一ID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)