打印
[STM32F1]

求助 STM32将全局变量改为临时变量 PWM输出不见了

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

程序目的
PA8 timer1 输出 3.6M 方波 用示波器检测脉冲

问题如下:
当 xid[20] 设置为临时变量 时候 无脉冲输出
当 xid[20] 设置为 全局变量 有脉冲输出
通过修改 Global   0/1 设定全局 还是局部变量
无论 xid[20] 怎么设置 均能 执行 printf("Hello world %s\r\n",__DATE__);

尝试过修改堆栈的大小,实验结果还是 跟上面一样 ,而且代码的变量的数量并不多,真见鬼了

主代码如下

#define Global        1


INT8U tmp[20];
#if(Global==1)
INT8U xid[20];
#endif
void TmpTask(void)
{
        INT8U i;
#if(Global==0)
        INT8U xid[20];
#endif
        Timer_Config();
        for(i=0;i<sizeof(xid);i++)        xid[ i ]=0;
        for(i=0;i<sizeof(xid);i++)        tmp
[ i ]=xid[ i ];
        printf("Hello world %s\r\n",__DATE__);
}

int main(void)
{
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);         
        RCC_Configuration();
        UartInit(USART1,119200L);
        TmpTask();

        while(1);
        return 0;
}




硬件设置的代码如下:

#define TimePeriod        20                                        //根据设定加密芯片的波特率 来设定给予芯片的时钟,时钟由STM32的脉冲提供
void InitTimerIO(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                        //GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void Timer_Config(void)
{
        TIM_TimeBaseInitTypeDef                TIM_TimeBaseStructure;//配置PWM需要使用的结构体声名
        TIM_OCInitTypeDef                  TIM_OCInitStructure;
        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);                        //36M in
        InitTimerIO();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);                        //36M in  72M max
        TIM_DeInit(TIM1);
        TIM_TimeBaseStructure.TIM_Period = TimePeriod-1;                                  //在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler = 0;                                                //  设置了用来作为 TIMx 时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

        /* PWM1 Mode configuration: Channel3 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                  //TIM_OCMode
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = TimePeriod/2;                                      //设置了待装入捕获比较寄存器的值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                 //TIM_OCPolarity :TIM 输出比较极性高
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);                          //使能或者失能 TIM3 在 CCR3 上的预装载寄存器
        /* TIM3 enable counter */
        TIM_Cmd(TIM1, ENABLE);                                                                          //开启时钟,别落下
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
        //TIM_CtrlPWMOutputs(TIM1, ENABLE);
}




/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;
/* RCC system reset(for debug purpose) 将外设RCC寄存器重设为缺省值 */
  RCC_DeInit();                                                                           

  /* Enable HSE 使能外部高速晶*/
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready 等待上一个步骤设置完毕*/
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer 启用指令预取*/
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state 用来设置FLASH存储器延时时钟周期数*/
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK 设置AHB时钟(HCLK)*/
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK/2 设置高速AHB时钟(PCLK2)72/2=36M*/
    RCC_PCLK2Config(RCC_HCLK_Div2);

    /* PCLK1 = HCLK/2 设置低速AHB时钟(PCLK1)72/2=36M*/
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz 设置PLL为系统时钟的倍数*/
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL 使能PLL*/
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}

    /* Select PLL as system clock source 设置系统时钟源 这里采用PLL*/
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}

  }

  /* Enable peripheral clocks --------------------------------------------------*/

}

Hw.rar (565.79 KB)

沙发
戈卫东| | 2014-12-29 11:21 | 只看该作者
其实问题可能是你的main()。。。。。这个函数不该返回的。。。。。

使用特权

评论回复
板凳
qbasicljx|  楼主 | 2014-12-29 11:30 | 只看该作者
本帖最后由 qbasicljx 于 2014-12-29 12:02 编辑

我重新看我的代码 [  i   ]是有的,在21ic 一发表 就不见了
我有受迫害症了

#define Global        1


INT8U tmp[20];
#if(Global==1)
INT8U xid[20];
#endif
void TmpTask(void)
{
        INT8U i;
#if(Global==0)
        INT8U xid[20];
#endif
        Timer_Config();
        for(i=0;i<sizeof(xid);i++)        xid[ i ]=0;
        for(i=0;i<sizeof(xid);i++)        tmp
[ i ]=xid[ i ];
        printf("Hello world %s\r\n",__DATE__);
}

int main(void)
{
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0);         
        RCC_Configuration();
        UartInit(USART1,119200L);
        TmpTask();

        while(1);
        return 0;
}

使用特权

评论回复
地板
戈卫东| | 2014-12-29 11:48 | 只看该作者
但是这两行并不会影响TIMER的行为的吧。。。?

使用特权

评论回复
5
戈卫东| | 2014-12-29 11:50 | 只看该作者
qbasicljx 发表于 2014-12-29 11:30
犯傻了
       for(i=0;i

编译器不会接受这样的语句吧?

使用特权

评论回复
6
qbasicljx|  楼主 | 2014-12-29 12:01 | 只看该作者
戈卫东 发表于 2014-12-29 11:21
其实问题可能是你的main()。。。。。这个函数不该返回的。。。。。

我在return 0; 之前 加上 while(1);
还是不行 真扯蛋了

使用特权

评论回复
7
qbasicljx|  楼主 | 2014-12-29 14:42 | 只看该作者
顶阿

使用特权

评论回复
8
小浣熊| | 2014-12-29 17:32 | 只看该作者
return语句和while语句貌似有点问题啊!!

使用特权

评论回复
9
mmuuss586| | 2014-12-29 20:48 | 只看该作者
跟踪下程序看看,哪一句引起的;

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
qbasicljx + 3 很给力!
10
lzqxs89| | 2014-12-30 00:05 | 只看该作者
最有效率的解决方法,请参考楼上!

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
qbasicljx + 3 很给力!
11
qbasicljx|  楼主 | 2014-12-30 09:40 | 只看该作者
谢谢大家关心 问题解决了
大部分代码是我使用 TIMX 非TIM1的时候的代码 抄过来的
TIM1的OC1输出 跟 TIMX 输出 有些不同 所以 应该对临时变量
TIM_OCInitStructure 进行一个初始值设置
        TIM_OCStructInit(&TIM_OCInitStructure);                                                //先默认初始化输出配置变量
3s for everyone help me

使用特权

评论回复
12
zh113214| | 2014-12-30 18:55 | 只看该作者
问题解决就好啊

使用特权

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

本版积分规则

16

主题

113

帖子

0

粉丝