打印

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

[复制链接]
6611|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PackBot|  楼主 | 2010-8-15 21:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在使用ST公司提供的新库编写程序,
发现有地方数据类型不对应,不知是库的问题,还是没理解好,请求帮助,提前谢过!
想打算使用SysTick实现延时,新库就只剩下了SysTick_Config()一个函数,还默认设置了优先级,先根据自己的情况改一下,发现一下问题
在NVIC嵌套中断控制初始化时,如下配置
NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;

  /* -------------------NVIC嵌套中断控制初始化------------------- */
  //设置优先级组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  //配置中断嵌套控制器
  NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


但是找到结构体的定义如下
/**
  * @简述  NVIC初始化结构体定义  
  */

typedef struct
{
  uint8_t NVIC_IRQChannel;                    

  uint8_t NVIC_IRQChannelPreemptionPriority;
  uint8_t NVIC_IRQChannelSubPriority;        
  FunctionalState NVIC_IRQChannelCmd;         
} NVIC_InitTypeDef;


其中红色  uint8_t NVIC_IRQChannel;   为无符号8位数
而在STM32f10x中找到通道却是-1,有符号数,如下所示
typedef enum IRQn
{
/******  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                   */


不知为什么?????
希望高手指点!!!
沙发
香水城| | 2010-8-15 22:18 | 只看该作者
不好意思,你在哪里看到SysTick_Config()这个函数?  又是在哪里看到你标为红色的赋值语句?

使用特权

评论回复
板凳
无冕之王| | 2010-8-16 10:00 | 只看该作者
不会是楼主自己加的吧:lol

使用特权

评论回复
地板
ilovezeno| | 2010-8-16 10:25 | 只看该作者
3.3的 SysTick_Config() 在core_cm3.h的1694行.......

使用特权

评论回复
5
ilovezeno| | 2010-8-16 10:28 | 只看该作者
其实lz有特殊需要的话,直接改SysTick_Config()里的nvic设置不就结了.......

使用特权

评论回复
6
香水城| | 2010-8-16 10:40 | 只看该作者
3.3的 SysTick_Config() 在core_cm3.h的1694行.......
ilovezeno 发表于 2010-8-16 10:25


没有在这里看到楼主说的语句,:dizzy:

使用特权

评论回复
7
PackBot|  楼主 | 2010-8-16 12:37 | 只看该作者
这些都是从V3.3.0库里找的

使用特权

评论回复
8
PackBot|  楼主 | 2010-8-16 12:38 | 只看该作者
/* ##################################    SysTick function  ############################################ */

#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)

/**
* @brief  初始化并启动SysTick系统时钟计数器和他的中断---Initialize and start the SysTick counter and its interrupt.
*
* @param   ticks   两次中断间滴答声的数量----number of ticks between two interrupts
* @return  1 = failed, 0 = successful
*
* 初始化系统时钟和他的中断,并启动系统时钟定时/计数器,在自由运行模式下产生周期性的中断。
* Initialise the system tick timer and its interrupt and start the system tick timer / counter in free running mode to generate
* periodical interrupts.
*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* 装入不可能的值(超出范围的值)---Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* 置位重新装入寄存器---set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* 设置Cortex-M3系统中断的优先级set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* 载入滴答计数器值---Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* 使能SysTick中断和SysTick定时器。---Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* 函数成功(返回零)---Function successful */
}

#endif

使用特权

评论回复
9
PackBot|  楼主 | 2010-8-16 12:40 | 只看该作者
这是core_cm3.h中的,1680行

使用特权

评论回复
10
PackBot|  楼主 | 2010-8-16 12:46 | 只看该作者
没有什么特别需求,只是探讨,嘿嘿,问题不在SysTick_Config(),在后面的数据类型!

使用特权

评论回复
11
PackBot|  楼主 | 2010-8-16 12:47 | 只看该作者
其中的汉语是自己加的翻译!

使用特权

评论回复
12
香水城| | 2010-8-16 14:02 | 只看该作者
8楼贴出的这段代码我看见了,但是没有看见楼主位红色显示的代码:

NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;

难道是我眼花了? :$

使用特权

评论回复
13
PackBot|  楼主 | 2010-8-16 16:21 | 只看该作者
这个是要用SysTick,自己添加的

使用特权

评论回复
14
香水城| | 2010-8-16 16:43 | 只看该作者
这个是要用SysTick,自己添加的
PackBot 发表于 2010-8-16 16:21


搞了半天原来是你自己改的,可是不能这样改的,不能这样随便添加的。

使用特权

评论回复
15
PackBot|  楼主 | 2010-8-16 21:59 | 只看该作者
不是吧,不这样用,那怎么设置系统级中断的优先级啊?

使用特权

评论回复
16
香水城| | 2010-8-16 22:03 | 只看该作者
不是吧,不这样用,那怎么设置系统级中断的优先级啊?
PackBot 发表于 2010-8-16 21:59


怎么设置系统级中断的优先级?你去看看8楼的那个INLINE的SysTick_Config()是怎么实现的,:$

使用特权

评论回复
17
PackBot|  楼主 | 2010-8-17 09:00 | 只看该作者
我看了,并且实验过,他就默认把SysTick设置成了15级,要是想修改其中断优先级,应该怎么操作?
在V2.0时,可以通过NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick,2,2);操作
现在这个函数没了,用下面这个函数取代了:
  //设置优先级组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  //配置中断嵌套控制器
  NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
18
香水城| | 2010-8-17 10:16 | 只看该作者
自己对照一下吧:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

----------------------

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 */
  else {
    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
}

使用特权

评论回复
19
PackBot|  楼主 | 2010-8-17 10:50 | 只看该作者
谢谢版主的耐心,小弟感激不尽!

使用特权

评论回复
20
香水城| | 2010-8-17 11:01 | 只看该作者
希望你是真的明白了,:lol

使用特权

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

本版积分规则

个人签名:创新是一个民族的灵魂!

0

主题

50

帖子

1

粉丝