打印

请教:数组需要定义到SRAM中,否则出错。

[复制链接]
3113|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MCUJunior|  楼主 | 2011-7-29 11:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 MCUJunior 于 2011-7-29 11:46 编辑

环境: IAR v5.4
   仿真器: USB HJTAG普及版
   芯片: STM32F103R8T6
   库函数:STM32 v1.0版
   底层OS:ucos v2.52

   问题描述:如果crc查表数组使用const定义,就进入不了串口2的接收中断,如果是不加const修饰,就没有问题,之前也出过类似问题,如果某个芯片的定义数据数组定义成const型,进不了串口中断。

   串口初始化代码:
    /*原生串口2,用于接收上位机的命令*/
    /* Configure USART2 Tx (PA.02) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /* Configure USART2 Rx (PA.03) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //9600波特率,8位数据位,1位停止位,没有奇偶校验
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART2, &USART_InitStructure);
   
    /* Enable the USART2 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    //只配置接收中断
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
   
    USART_Cmd(USART2, ENABLE);

NVIC相关配置:
#ifdef  VECT_TAB_RAM  
    /* Set the Vector Table base location at 0x20000000 */
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   

#endif

    /* Configure zero bit for preemption priority */
    /*全部4位都用来指定响应优先级*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

ISR程序:
void USART2_IRQHandler(void)
{
    OS_CPU_SR  cpu_sr = 0;
    u8 Rdata = 0;
  
    OS_ENTER_CRITICAL();    /* Tell uC/OS-II that we are starting an ISR          */
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    /*清除中断*/
    if(USART_GetFlagStatus(USART2,USART_IT_RXNE)==SET)
    {
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        Rdata = USART_ReceiveData(USART2);
        
        RingBufWriteOne(&SerialFIFO, Rdata);
        
              OSSemPost(Sem_SerialData);
      }

      OSIntExit();            /* Tell uC/OS-II that we are leaving the ISR          */  
}

CRC查找表数组
//const
unsigned short crc16_table[256] = 。。。。

很不理解数组定义到flash中,对STM32串口会有什么影响?
沙发
IJK| | 2011-7-29 13:27 | 只看该作者
出现问题需要进行检查,这时最好不要让问题混淆起来,建议先不用uCOS,看串口中断能不能进去

使用特权

评论回复
板凳
MCUJunior|  楼主 | 2011-7-29 13:30 | 只看该作者
2# IJK
我感觉是const可能并没把它定义到flash区,应该跟ucos没关系吧,因为配置好了中断,如果串口接收到了数据,到中断ISR,是不受ucos控制的。

再试下。

使用特权

评论回复
地板
MCUJunior|  楼主 | 2011-7-29 14:09 | 只看该作者
crc16_table[256] 看样子是给定义到flash区了,可咋影响的串口呢?

使用特权

评论回复
5
MCUJunior|  楼主 | 2011-7-29 15:17 | 只看该作者
USART_InitStructure.USART_Clock = USART_Clock_Disable; //串口时钟禁止
    USART_InitStructure.USART_CPOL = USART_CPOL_Low; //时钟下降沿有效
    USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
    USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

串口初始化时补上这四句就OK了,数组也可以加const了,为啥呢?
之前好像印象里这四句是同步UART用的,异步情况下可以不写这四句代码,但是追踪时,发现加const与不加const,USART_LastBit数值是不同的,所以加了这四句,就正确了。
    好像不设置就变量数值随机了?

使用特权

评论回复
6
IJK| | 2011-7-29 15:57 | 只看该作者
crc16_table[256] 看样子是给定义到flash区了,可咋影响的串口呢?
MCUJunior 发表于 2011-7-29 14:09


看看MAP文件,就知道了

使用特权

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

本版积分规则

72

主题

178

帖子

0

粉丝