发新帖我要提问
12
返回列表
打印

STM32 新库V3.3.0数据类型不对应问题?

[复制链接]
楼主: PackBot
手机看帖
扫描二维码
随时随地手机跟帖
21
PackBot|  楼主 | 2010-8-17 11:02 | 只看该作者 回帖奖励 |倒序浏览
你看小弟这样理解对吗?
优先级通过这个函数设定,uint32_t SysTick_Config(uint32_t ticks)
优先级采用默认设置NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
在stm32f10x.h中定义
#define __NVIC_PRIO_BITS          4 /*!< STM32 uses 4 Bits for the Priority Levels    */
经过上面运算,NVIC_SetPriority(),中的优先级变为7,你看这么理解对吗?
还有个新的问题就是,在这种情况下,优先级的组是怎么分的?
再次感谢版主的耐心!:P

使用特权

评论回复
22
香水城| | 2010-8-17 11:06 | 只看该作者
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
  if(IRQn < 0) {   // 请注意这里
    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */

使用特权

评论回复
23
shinic| | 2012-2-29 10:57 | 只看该作者
楼主,在V3.3.0新库中没有V2.0.3中文件""的函数void NVIC_SystemHandlerPriorityConfig(u32 SystemHandler, u8 SystemHandlerPreemptionPriority, u8 SystemHandlerSubPriority);这个函数可以设置
/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/
  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */


的优先级,如果用库函数V3.3.0中的函数void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);只能设置外部中断的优先级,而不能设置Cortex-M3内核中的中断的优先级,原因是他们的中断优先级寄存器地址不同,外部中断使用Interrupt Priority Registers,地址:0xE000E400-0xE000E41F;内核中断(包括SysTick_IRQn)使用System Handler Priority Registers,地址:0xE000ED18, 0xE000ED1C , 0xE000ED20,详细的资料需要查阅ARM公司的Cortex-M3手册的Nested Vectored Interrupt Controller章节。我正在修改V2.0.3的NVIC函数,使其与V3.3.0兼容,马上就快改好了,有些寄存器ARM公司的定义和ST公司的定义不同,所以要改改。还有提醒你,V3.3.0的函数比V2.0.3的函数功能少点,所以如果你想使用V2.0.3的函数,那就去修改使其两个库兼容。

使用特权

评论回复
24
zxm19820916| | 2013-12-9 16:58 | 只看该作者
香水城 发表于 2010-8-17 10:16
自己对照一下吧:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  
其中:SysTick_IRQn = -1,__NVIC_PRIO_BITS = 4;
即 NVIC_SetPriority (-1, 15);
则执行
if(IRQn < 0) {
     SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); }
而(uint32_t)(IRQn) = 0xFFFFFFFF,所以[((uint32_t)(IRQn) & 0xF)-4] = 0xF - 4 = 11.
((priority << (8 - __NVIC_PRIO_BITS)) & 0xff) = (15 << 4)& 0xff = (0x0f << 4) & 0xff = 0xf0 = 240.
这都是什么意思?一塌糊涂,请指教啊!

使用特权

评论回复
25
zxm19820916| | 2013-12-9 17:06 | 只看该作者
PackBot 发表于 2010-8-17 11:02
你看小弟这样理解对吗?
优先级通过这个函数设定,uint32_t SysTick_Config(uint32_t ticks)
优先级采用默 ...

优先级怎么是7?怎么计算的?我算的是240啊

使用特权

评论回复
26
zxm19820916| | 2013-12-9 17:06 | 只看该作者
PackBot 发表于 2010-8-17 11:02
你看小弟这样理解对吗?
优先级通过这个函数设定,uint32_t SysTick_Config(uint32_t ticks)
优先级采用默 ...

优先级怎么是7?怎么计算的?我算的是240啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则