嵌入式应用之-初始化部分
来源:互联网 发布:mac版word怎么看字数 编辑:程序博客网 时间:2024/05/20 22:37
main 是我们的一个入口函数,那么再开始运行任务之前我们应该做些什么?
main
1、
问题:stm32 睡眠模式默认debug端口不打开,设置DBGMCU_STANDBY可以打开。
问题:在调试模式下,内核被调试器停止时,相关外设是否同时停止. 比如定时器输出,如果是连接了电机什么的时候,调试到某个地方断点了,默认定时器会继续跑,这时电机电流可能会失控烧电路,设置了对应的位后,定时器会停止,输出会固定在CCMR设置的电平. 对于串行通信,内核停止并且设置了对应的位,数据就有可能发了一半停下来,等内核跑了再继续发,这样数据时序就不对了,但这种情况对于分析内核与数据间的时序是有帮助的.
因此我们可以在程序开始时设置DBGMCU.
DBGMCU_Config(DBGMCU_STANDBY,ENABLE);
stm32f10x_dbgmcu.c 库函数:
void DBGMCU_Config(u32 DBGMCU_Periph, FunctionalState NewState){ /* Check the parameters */ assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) {DBGMCU->CR |= DBGMCU_Periph; } else {DBGMCU->CR &= ~DBGMCU_Periph; }}
2、
/=========关闭JTAG-DP,启用SW-DP,SWJ_CFG[2:0]=010===========/
#if(SYSTEM_RUN_IN_DEBUG==GAL_YES)RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);#elseRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);#endif
3、PWR包括功耗管理和低功耗模式选择。(电源管理也是必不可少的)
void WKUP_Init(FunctionalState nEn){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0); GPIO_Init(GPIOA, &GPIO_InitStructure); PWR_ClearFlag(PWR_FLAG_WU); PWR_WakeUpPinCmd(nEn);}
4、看门狗是防止程序跑飞
void ClearWatchDog(void){#if(SYSTEM_RUN_IN_DEBUG==GAL_NO)IWDG_ReloadCounter();#endif}
5、低功耗处理I/O口
void InitialIOInLowCost(void)
{
//以下代码是控制低功耗的关键。
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM, DISABLE);
// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FLITF, DISABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL, DISABLE); //S1:关闭除RCC_APB1Periph_PWR外的全部时钟;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, ENABLE);
//---- 把GPIO_Init 的结果直接运行,降低运行时间-------GPIOA->CRL=0X44444444;GPIOA->CRH=0X44444444;GPIOB->CRL=0X44444444;GPIOB->CRH=0X44444444;GPIOC->CRL=0X44444444;GPIOC->CRH=0X44444444;GPIOD->CRL=0X44444444;GPIOD->CRH=0X44444444;GPIOE->CRL=0X44444444;GPIOE->CRH=0X44444444;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, DISABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);/* 唤醒按键和电源检测输入口时钟使能 */uInitIRWakeupStatus(); /* 红外唤醒初始化 */
}
5、初始化应该是个连续的过程应该这里有相关数据的初始化,但不能保证初始化过程中不会掉电,因此我们这里还要增加掉电复位等处理。
首先看看我们的运行模式有哪些:
#define AC_POWER_ON 0#define AC_POWER_OFF 1#define SYSTEM_RESET 1#define POWER_ON 0#define WAIT_MODE 2#define STOP_MODE 3#define IDLE_MODE 4#define POWER_OFF 5#define SYSTEM_GETRTC 6
检测函数:
unsigned char GetACPowerStatus(void) //交流电检测{ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//--AA是否是市电上电判断管脚AA-- GPIO_InitStructure.GPIO_Pin = (IN_PECHK_PIN ); GPIO_Init(IN_PECHK_PORT, &GPIO_InitStructure); if(IfPowerDown()) { return (AC_POWER_OFF); } else { return (AC_POWER_ON); }}
#
/////////////掉电检测uchar IfPowerDown(void){ uchar ucTem,ucData; ucTem=8; ucData=0; while(ucTem) { ucData+=GetPowerSupplyStatus(); ucTem--; } if(ucData<4) { return 1; } return 0;// if(1==GetPowerSupplyStatus())// {// return 0;// }// return 1;}
#
#define GetPowerSupplyStatus() (GPIO_ReadInputDataBit(IN_PECHK_PORT,IN_PECHK_PIN))
判断后初始化函数:
uchar RunCPUToDifferentPowerMode(uchar Mode)
uchar RunCPUToDifferentPowerMode(uchar Mode){ //ulong ulTempTest;#if(CONFIG_METER_PREPAY_MODE != CONFIG_METER_PREPAY_MODE_DISABLE) uchar ucTempStatus;#endifuchar ucTemp1;uchar Staks;InitWatchDog();ClearWatchDog(); switch(Mode) { case SYSTEM_RESET: ; case POWER_ON: ; case POWER_OFF: ; default: ; }}
#
InitializeVariable
uchar InitializeVariable(uchar Mode){ ulong ulTempTest, ulTime; uchar ucTempStatus; uint ucRemteTimesCount;#if(HAVING_PROGRAMKEY== GAL_YES) uint uiTempProgramTime;#endif // uchar ucSystemRestOk; //STR_CALENDAR FMtime; uchar Staks,uchannel; //gucSystemRestOk=0; switch(Mode) { case SYSTEM_RESET: ///停电唤醒初始化 ; case POWER_ON: ; case POWER_OFF: ; default : ; }}
- 嵌入式应用之-初始化部分
- 嵌入式应用之-任务
- mono嵌入式应用研究(二):虚拟机的初始化
- android之intent部分应用
- Scala之部分应用函数
- 游戏编程之七 例程之初始化部分
- OK6410之uboot时钟初始化---嵌入式回归第十一篇
- 嵌入式linux应用开发之:初识Qt
- IT行业分析之嵌入式应用
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发之:初识Qt
- 嵌入式算法之查表法的应用
- 嵌入式应用之-任务进程框架
- 嵌入式应用开发之基础设备控制
- 【原创分享】嵌入式linux应用之内核移植定制篇-后篇(修复部分问题)(linux-3.8.12 mini2440)
- 程力集团网址大全
- leetcode--18. 4Sum
- POJ 3264 Balanced Lineup
- ros如何及时清除障碍物层或者超声波层的的消息 clear_costmap_recovery 代码详解
- httpclient与springmvc整合
- 嵌入式应用之-初始化部分
- servlet之文件的上传下载(一)
- 用PopupWindow实现下拉列表,并再次熟悉一些其他基础知识点。
- 最小公倍数和最大公约数
- 螺旋矩阵 II -LintCode
- QString::arg()//用字符串变量参数依次替代字符串中最小数值
- 内容提供者——查询联系人
- 驱寒药不妨试试这几种食物
- 链表中p->next=head->next;语句解析