OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12506|回复: 3

关于sys.c的设置

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2011-10-11
在线时间
0 小时
发表于 2011-11-2 20:02:52 | 显示全部楼层 |阅读模式

void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) 
{
 u32 temp,temp1;  
 temp1=(~NVIC_Group)&0x07;//取后三位
 temp1<<=8;
 temp=SCB->AIRCR;  //读取先前的设置
 temp&=0X0000F8FF; //清空先前分组
 temp|=0X05FA0000; //写入钥匙
 temp|=temp1;   
 SCB->AIRCR=temp;  //设置分组              
}
//设置NVIC
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority       :响应优先级
//NVIC_Channel           :中断编号
//NVIC_Group             :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
//CHECK OK
//100329
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 
{
 u32 temp; 
 u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址
 u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
 IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置
 MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
 temp=NVIC_PreemptionPriority<<(4-NVIC_Group);  
 temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
 temp&=0xf;//取低四位

 if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
 else NVIC->ISER[1]|=1<<(NVIC_Channel-32);   
 NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级                 
}

//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
//参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置1个IO口,多个IO口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线  
//待测试...
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
 u8 EXTADDR;
 u8 EXTOFFSET;
 EXTADDR=BITx/4;//得到中断寄存器组的编号
 EXTOFFSET=(BITx%4)*4;

 RCC->APB2ENR|=0x01;//使能io复用时钟

 AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
 AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx
 
 //自动设置
 EXTI->IMR|=1<<BITx;//  开启line BITx上的中断
 //EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
  if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
 if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
}


//不能在这里执行所有外设复位!否则至少引起串口不工作.     
//把所有时钟寄存器复位
//CHECK OK
//091209
void MYRCC_DeInit(void)
{                   
 RCC->APB1RSTR = 0x00000000;//复位结束   
 RCC->APB2RSTR = 0x00000000;
  
   RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.  
   RCC->APB2ENR = 0x00000000; //外设时钟关闭.     
   RCC->APB1ENR = 0x00000000;  
 RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                 
 RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]     
 RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
 RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP      
 RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
 RCC->CIR = 0x00000000;     //关闭所有中断
 //配置向量表     
#ifdef  VECT_TAB_RAM
 MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  
 MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}


我想问问,为什么要设置NVIC和向量表???在SYS.C里面

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-2 21:42:59 | 显示全部楼层
回复【楼主位】kyng:
---------------------------------
因为不设置就没法工作。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-11-3 12:24:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
话说,我每次玩的时候都没配置向量表,只设置了系统时钟,中断分组和全局中断,有时候连中断都没用,照样工作正常。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-3 12:35:05 | 显示全部楼层
配置如下:
//配置向量表   
#ifdef  VECT_TAB_RAM
MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else   
MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
这个是默认的配置,默认配置的参数为0,而复位后的值也是0,所以,你不配置也可以工作.但是一旦你用到IAP功能的时候,这个就很有用了.而且必须设置,否则程序就死了.
因为IAP你一般是2个代码在芯片上,上电的时候跑bootloader程序,然后根据一些标志来决定是不是跑用户程序,用户程序只能是在非0X08000000地址开始的地方,所以你的中断向量偏移也必定不是在0X08000000处开始,这时候就要根据你的代码来修改MY_NVIC_SetVectorTable的参数值了.而且非修改不可!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 20:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表