OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6578|回复: 6

STM32F103C8T6不能同时输出PWM和使用USART串口问题

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-11-30
在线时间
4 小时
发表于 2017-11-30 23:08:57 | 显示全部楼层 |阅读模式
1金钱
本人新手一枚,现在用STM32F103C8T6来做个东西,需要用到两路PWM和USART串口,看了别人的示例代码后也跟着鼓捣了一下,发现两路PWM是可以正常输出的,但是USART就是不能正常收发。望高人指点一下迷津,代码如下:主程序:

[mw_shl_code=c,true]
int main(void)
{
    SystemInit();
    GPIO_Config();
    TIM2_Config();
    TIM3_Config();
    USART1_Config();
    NVIC_CONFIG();
       
    //输入针脚全部高电平
    GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_8);
    GPIO_SetBits(GPIOB,  GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13);

    while(1)
    {
       UART1Test();
    }
}

[/mw_shl_code]



GPIO_Config:
[mw_shl_code=c,true]
void GPIO_Config(void)
{

                GPIO_InitTypeDef GPIO_InitStructure;
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
                GPIO_DeInit(GPIOA);
               
                //GPIO_Pin_1为PWM1,GPIO_Pin_7为PWM2,GPIO_Pin_9为USART1_TX
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_7 | GPIO_Pin_9;   
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA,&GPIO_InitStructure);
               
                //USART1_RX
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                      //浮空输入
                GPIO_Init(GPIOA, &GPIO_InitStructure);   
               
                //输出针脚配置
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_8;                                                                                       
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         // 推挽输出                                                                                                                                                                                                                  
                GPIO_Init(GPIOA, &GPIO_InitStructure);
                //输入针脚配置
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;                                                                                       
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                   // 下拉输入                                                                                                                                                                                                          
                GPIO_Init(GPIOA, &GPIO_InitStructure);
       
               

                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
                GPIO_DeInit(GPIOB);
                //输入针脚配置
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9;                                                                                       
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         // 推挽输出                                                                                                                                                                                                                  
                GPIO_Init(GPIOB, &GPIO_InitStructure);
                //输出针脚配置
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;                                                                                       
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                   // 下拉输入                                                                                                                                                                                                          
                GPIO_Init(GPIOB, &GPIO_InitStructure);
       
}

[/mw_shl_code]



TIM2_Config:
[mw_shl_code=c,true]
void TIM2_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
       
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    TIM_DeInit(TIM2);       

    //配置TIM2的时钟输出频率,以及其它相关参数初始化
    TIM_TImeBaseStructure.TIM_Prescaler=71;//设置PWM的频率
    TIM_TImeBaseStructure.TIM_CounterMode=0;
    TIM_TImeBaseStructure.TIM_Period=499;//配置溢出值
    TIM_TimeBaseInit(TIM2,&TIM_TImeBaseStructure);


    //设置PWM的输出方式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    //配置占空比
    TIM_OCInitStructure.TIM_Pulse=1;
    TIM_OC2Init(TIM2,&TIM_OCInitStructure);
    TIM_ForcedOC1Config(TIM2,TIM_ForcedAction_Active);
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
    TIM_Cmd(TIM2,ENABLE);
    TIM_CtrlPWMOutputs(TIM2,ENABLE);
    TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);

}



void TIM2_IRQHandler(void)
{
    a++;
    if(a%4500==0) {
        a=0;
        CCR2_Val+=1;
        if(CCR2_Val<=250) {
            TIM2->CCR2 = CCR2_Val;
        } else {
            CCR2_Val=251;
        }
        b++;
        if(b==300) {
            b=0;
            if(kv==1) {
                kv=0;
                GPIO_ResetBits(GPIOA, GPIO_Pin_2);
            } else {
                kv=1;
                GPIO_SetBits(GPIOA, GPIO_Pin_2);
            }
        }
    }
}

[/mw_shl_code]




TIM3_Config:
[mw_shl_code=c,true]
void TIM3_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    TIM_DeInit(TIM3);       

    //配置TIM3的时钟输出频率,以及其它相关参数初始化
    TIM_TImeBaseStructure.TIM_Prescaler=35;//设置PWM的频率
    TIM_TImeBaseStructure.TIM_CounterMode=0;
    TIM_TImeBaseStructure.TIM_Period=499;//配置溢出值
    TIM_TimeBaseInit(TIM3,&TIM_TImeBaseStructure);


    //设置PWM的输出方式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    //配置占空比
    TIM_OCInitStructure.TIM_Pulse=1;
    TIM_OC2Init(TIM3,&TIM_OCInitStructure);
    TIM_ForcedOC1Config(TIM3,TIM_ForcedAction_Active);
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
    TIM_Cmd(TIM3,ENABLE);
    TIM_CtrlPWMOutputs(TIM3,ENABLE);
    TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

}


void TIM3_IRQHandler(void)
{
    j++;
    if(j%4500==0) {
        j=0;
        CCR3_Val+=1;
        if(CCR3_Val<=250) {
            TIM3->CCR2 = CCR3_Val;
        } else {
            CCR3_Val=251;
        }
    }
}


[/mw_shl_code]




USART1_Config:
[mw_shl_code=c,true]
void USART1_Config(void)
{
    USART_InitTypeDef USART_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    USART_DeInit(USART1); //UART1初始化       


    /* USART1 工作模式配置 */
    USART_InitStructure.USART_BaudRate = 9600;        //波特率设置:9600
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //数据位数设置:8位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;         //停止位设置: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(USART1, &USART_InitStructure);  //初始化USART1
       
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);        //发送中断使能,(发送数据寄存器为空)
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        //接收中断使能,读数据寄存器非空
               
    USART_Cmd(USART1, ENABLE);// USART1使能

}

/*发送一个字节数据*/
void UART1SendByte(unsigned char SendData)
{
    USART_SendData(USART1,SendData);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

/*接收一个字节数据*/
unsigned char UART1GetByte(unsigned char* GetData)
{
    if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {   return 0;//没有收到数据
    }
    *GetData = USART_ReceiveData(USART1);
    return 1;//收到数据
}
/*接收一个数据,马上返回接收到的这个数据*/
void UART1Test(void)
{
    unsigned char i = 0;

    while(1)
    {
        while(UART1GetByte(&i))
        {
            USART_SendData(USART1,i);
        }
    }
}

void USART1_IRQHandler(void)
{

}


[/mw_shl_code]



NVIC_CONFIG:
[mw_shl_code=c,true]
void NVIC_CONFIG(void)
{
    NVIC_InitTypeDef  NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
       
    NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    //USART1中断优先级设置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                        //选择USART1中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //设置了成员NVIC_IRQChannel中的抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //设置了成员NVIC_IRQChannel中的从优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //IRQ通道被使能。
    NVIC_Init(&NVIC_InitStructure);       
}



[/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-1 00:30:39 | 显示全部楼层
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-11-30
在线时间
4 小时
 楼主| 发表于 2017-12-1 00:42:22 | 显示全部楼层
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
我把这两句代码注释了就可以了,度娘了下说是tim的中断和USART的中断有冲突,但是不知道怎么改代码,求指导
回复

使用道具 举报

35

主题

309

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2641
金钱
2641
注册时间
2016-8-10
在线时间
470 小时
发表于 2017-12-1 09:16:10 | 显示全部楼层
你的中断优先级全都是一样的,肯定会有冲突的
回复

使用道具 举报

28

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2016-11-22
在线时间
66 小时
发表于 2017-12-1 11:00:23 | 显示全部楼层
huyang201306 发表于 2017-12-1 09:16
你的中断优先级全都是一样的,肯定会有冲突的

优先级配置成一样的不会产生冲突,因为中断序列号不一样
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-11-30
在线时间
4 小时
 楼主| 发表于 2017-12-1 11:02:31 | 显示全部楼层
我把tim2的中断改为0,tim3的为1,suart改为2还是不行,请问要怎么改呢?小白一枚,白菜都没那么白,求调教~~
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-11-25
在线时间
3 小时
发表于 2018-3-27 14:18:47 | 显示全部楼层
楼主怎么解决的,求支招
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表