[STM32F0]

GPIO口和PWM口分时复用出问题

[复制链接]
1701|26
手机看帖
扫描二维码
随时随地手机跟帖
lium|  楼主 | 2018-7-26 19:38 | 显示全部楼层 |阅读模式
GPIO, PWM, pi, IO, gp
大家好,我在用PA8做普通IO输出口使用,然后做PWM口使用,初始化顺序是开始设置输出口,然后设置为PWM口,为何PWM口失效,不起作用
guoyt| | 2018-7-26 19:40 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
lium|  楼主 | 2018-7-26 19:41 | 显示全部楼层
void PwmIoOut(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  /* 使能GPIOA时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  /* 配置LED相应引脚PA8 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);        
}
下面是初始化PWM口
void TIM1PwmInit(FunctionalState flag)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, flag/*ENABLE*/);
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, flag/*ENABLE*/); //使能定时器1
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);// 第2 功能TIM1

        //**************************************************************************
        //     定时器1设置: 2分频,24KHz频率,
        //**************************************************************************
        TIM_TimeBaseStructure.TIM_Period = 999;    // 设置自动重装周期值
        TIM_TimeBaseStructure.TIM_Prescaler = 1;   //2分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// 向上计数

        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//初始化定时1

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//PWM2模式
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM_OCPolarity_High;//输出高
        TIM_OCInitStructure.TIM_Pulse = 5;       // 300-1 30%占空比
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);


        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//

        /* TIM1 enable counter */
        TIM_Cmd(TIM1, flag/*ENABLE*/);

        TIM_CtrlPWMOutputs(TIM1,flag/*ENABLE*/);


}

main()
{
PwmIoOut();
TIM1PwmInit();    //PWM失效,不能起作用,请大家分析原因,谢谢
}

使用特权

评论回复
hanwe| | 2018-7-26 19:43 | 显示全部楼层

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, flag/*ENABLE*/);
楼主,你这个Flag不是函数库的语法,编译器会误判吗?

使用特权

评论回复
yufe| | 2018-7-26 19:45 | 显示全部楼层
还有你的硬件资源真的紧张到这样吗,运行过程不停的初始化IO口很累的,一般也只在输入/输出间转换。还是复用功能,要浪费很多系统宝贵资源呀!

使用特权

评论回复
wangpe| | 2018-7-26 19:46 | 显示全部楼层

可能是因为功能寄存器没有配置好

使用特权

评论回复
langgq| | 2018-7-26 19:50 | 显示全部楼层

主函数缺少while(1)死循环,瞬间就跑完了。
还有,建议使用TIM2 或者 TIM3

使用特权

评论回复
wangzsa| | 2018-7-26 19:53 | 显示全部楼层

有道理,应该在while(1)里PwmIoOut();

使用特权

评论回复
huangchui| | 2018-7-26 19:54 | 显示全部楼层

运行过程不停的初始化IO口很繁琐,资源不够用吗?

使用特权

评论回复
guoyt| | 2018-7-26 19:56 | 显示全部楼层
是的, Systick 中断是为操作系统提供时基的, osdelay() 的时基来源于此. Systick 的中断优先级一般设置得比较低, 因为时基系统相对有较长的执行时间. 这样的设计可以避免 systick 影响其它中断的实时性.

使用特权

评论回复
zhuhuis| | 2018-7-26 19:58 | 显示全部楼层
你的问题是, 你的中断就不应该调用 osdelay(), 中断的任务保留必要的信号和状态变量, 然后交割主循环或者任务去做剩下的处理, 这里你可以做个处理任务去对接这个中断服务.

使用特权

评论回复
yufe| | 2018-7-26 20:00 | 显示全部楼层
当然还有不推荐的办法, 你非得这样弄, 把调用 osdelay() 的中断的优先级设置得比 systick 更低. 为了追求最简练的系统, 这样做也不是非得要禁止, 但有个严重的副作用, 这个中断会影响其它所有任务的实时性! 因为这个中断服务就相对于超级优先级的任务了.

使用特权

评论回复
lium|  楼主 | 2018-7-26 20:02 | 显示全部楼层

中断的任务保留必要的信号和状态变量, 然后交割主循环或者任务去做剩下的处理

使用特权

评论回复
lium|  楼主 | 2018-7-26 20:03 | 显示全部楼层

我看了文档,感觉这样中断好像无法嵌套

使用特权

评论回复
langgq| | 2018-7-26 20:05 | 显示全部楼层
OS的操作实在是太高端了,我至今搞不懂咋回事。

使用特权

评论回复
lium|  楼主 | 2018-7-26 20:07 | 显示全部楼层
在整一个通讯的玩意,3个下行采集串口,2个上行串口,不用os,处理能力大打折扣

使用特权

评论回复
wangzsa| | 2018-7-26 20:08 | 显示全部楼层
看来是个大的数据贪吐量的工作, 这考验的是你的数据结构和数据处理的能力, 并未见得发挥了 OS 的优势!

使用特权

评论回复
zhuww| | 2018-7-26 20:10 | 显示全部楼层
你使能中断同时设置优先级就是。

使用特权

评论回复
zhanglli| | 2018-7-26 20:12 | 显示全部楼层
在FreeRTOS中如何判断堆栈使用情况?uCOS可以很方便的查看

使用特权

评论回复
lium|  楼主 | 2018-7-26 20:14 | 显示全部楼层
数据并发处理

使用特权

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

本版积分规则

915

主题

9579

帖子

3

粉丝