移植原子407工程到107上,没有外部RAM情况下只用内部RAM,使用了内存管理的方式。ucosii上内存管理了50K(总共64K)时,程序是可以正常工作的,这个时候编译ZI-DATA已经要到64K了。我继续换成UCOSIII就编译不通过了,提示内存不足,内存池改成40k编译没错误,但是内存分配不成功网卡驱动不了。。 求教!!! 根据原子的例程,网卡初始化申请了四个缓存,lwip初始化又申请了四个缓存,一共这八个地方使用了内存管理。。这几个地方是不是很耗内存,管理小了就分配失败管理大了又编译不了。不是很了解这样管理内存的好处是什么,为什么会编译不了,是不是初始化申请太多又没有释放导致内存溢出?看到网上别人没有这种内存管理整个编译下来ZI-DATA才40几K,感觉应该是可以装得下的啊。是不是我哪里弄错,请教大家。 如果管理40K这里会分配失败。 企业微信截图_16170864191505.png (4.74 KB 下载次数: 0) 下载附件 这里使用了内存管理昨天 14:41 上传
用STM32的定时器TIM1产生四路两两互补的PWM波,用TIM2的中断来改变TIM1的输出波形的比较值,时序图如下,示波器的波形图为:用TIM1的CH1CH2CH1NCH2N来产生A、B、C、D代码为 void TIM1_PWM_Init(u16 arru16 psc) { RCC->APB2ENR|=1<<11; //使能TIM1的时钟 // RCC->APB2ENR|=0<<1; //使能复用时钟 RCC->APB2ENR|=1<<2; //使能GPIOA的时钟CH1-PA9 CH2-PA10 CH1N-PB13 CH2N-PB14 RCC->APB2ENR|=1<<3; //使能GPIOB的时钟 GPIOA->CRH&=0XFFFFFF00; //PA9为复用推挽输出,最大速度50MHZ ,必须为复用推挽输出!!! GPIOA->CRH|=0X000000BB; GPIOB->CRH&=0XF00FFFFF; //PA9为复用推挽输出,最大速度50MHZ ,必须为复用推挽输出!!! GPIOB->CRH|=0X0BB00000; TIM1->CCR1=6199; TIM1->CCR2=7199; TIM1->ARR=arr; //设定计数器自动重装值 TIM1->PSC=psc; //预分频器不分频 // TIM1->BDTR|=0xCD; // 死区时间设定 TIM1->CCER|=1<<0;//TIM1CH1通道开关使能 TIM1->CCER|=1<<2;//TIM1CH1N 通道开关 TIM1->CCER|=1<<4; TIM1->CCER|=1<<6; TIM1->CCMR1|=7<<4; //CH1 PWM2模式 TIM1->CCMR1|=1<<3; //CH1预装载使能 TIM1->CCMR1|=7<<12; //CH2 PWM2模式 TIM1->CCMR1|=1<<11; //CH1预装载使能 TIM1->CR1|=0X80;// CR1 ARPE自动重装载预装载允许位使能 // TIM1->BDTR=0; TIM1->BDTR=0x80; TIM1->BDTR|=1<<15; //刹车使能位置1,开启所有输出通道 // TIM1->CR1|=0X01; //使能定时计数器1 } void TIM2_Init(u16 arru16 psc ) { RCC->APB1ENR|=1<<0; //使能TIM2的时钟 TIM2->CR1&=0XFFEE; //计数器向上计数 TIM2->CR1|=0X0001; TIM2->ARR=arr; TIM2->PSC=psc; TIM2->DIER|=1<<0; //允许更新中断 MY_NVIC_Init(20TIM2_IRQn2); //抢占优先级2,子优先级2,组2 } void TIM2_IRQHandler(void) { static u8 cnt=0; if(TIM2->SR&0X0001) //产生溢出中断 { if (cnt==0) { TIM2->ARR=7200; //定时器中断时间设置为100us TIM2->PSC=0; TIM1->CCR1|=1<<0; TIM1->CCR1=6199; //6199 TIM1->CCR2=7199; cnt=1; } if(cnt==1) { TIM2->ARR=7200; //定时器中断时间设置为800us TIM2->PSC=7; TIM1->ARR=7200; //定时器中断时间设置为800us TIM1->PSC=7; TIM1->CR1&=~(1<<0); TIM1->CCR1=7199; TIM1->CCR2=7199; cnt=2; LED1=!LED1; } if (cnt==2) { TIM2->ARR=7200; //定时器中断时间设置为100us TIM2->PSC=0; TIM1->ARR=7200; //定时器中断时间设置为100us TIM1->PSC=0; TIM1->CR1|=1<<0; TIM1->CCR1=7199; TIM1->CCR2=4500; cnt=0; } } TIM2->SR&=~(1<<0); //清楚中断标志位 } 感觉没有按照我的中断来输出波形,这是为什么呀,要实现我时序那样的波形应该写代码呀
最近几天想详细研究一下STM32的启动,STM32分散加载文件和启动文件的语法介绍在哪可以找到呢?
目前用状态机+定时器中断(按键检测函数放在中断服务函数里每10ms扫描一次)实现按键长短按,长按灯亮,短按可以循环调光,再次长按灯灭。如果要结合低功耗模式(如:待机)应该怎么实现呢?希望长按开机点亮灯,开机后短按循环调光,开机状态长按关机?被卡了很久,请各位大佬指点一下,谢谢
MDK的启动文件和分散加载文件同时运行的话,两者使用哪个?两者是否冲突呢?RAM和ROM的分配以哪个为准呢?
手头一个项目,启动文件被修改过了,想要一个原始的未修改的启动文件,应该在哪下载呢?官网没找到,还有用的是以前3.5的标准库。
中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 ,EXTI9_5_IRQHandler,中断线 10-15 共用中断函数 EXTI15_10_IRQHandler。比如进去EXTI9_5_IRQHandler的时候还需要判断中断线,这样的话,如果同时触发中断的话5-9同时触发中断的话怎么办呢?
分散加载文件中的内存是如何和实际对应起来的呢?比如下面的代码:LR_IROM1 0x08000000 0x00010000 { ; load region size_region ER_IROM1 0x08000000 0x00010000 { ; load address = execution address *.o (RESET +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00002800 { ; RW data .ANY (+RW +ZI) } HEAP +0 { *.o (HEAP) } STACKS 0x20002800 -0x00000200 { *.o (STACK) } } 我的FLAH是128kb,应该是0x00020000RAM是20kb,应该是0x00005000为什么和实际对应不上呢?
MDK编译报错如下显示:..\boot\lc.scat(21): warning: L6329W: Pattern *.o(HEAP) only matches removed unused sections.这个应该如何去掉呢?
当STM32加ucos的时候,启动文件中的堆栈还起作用吗,因为启动文件中的堆栈肯定是不够的。那么这个堆栈在哪里分配呢?