標(biāo)題:
STM32F103C8T6單片機(jī)串口1和TIM_CH1產(chǎn)生PWM不能同時(shí)工作?請(qǐng)問各位大神這是怎么回事
[打印本頁]
作者:
ShawZJ
時(shí)間:
2023-4-20 14:23
標(biāo)題:
STM32F103C8T6單片機(jī)串口1和TIM_CH1產(chǎn)生PWM不能同時(shí)工作?請(qǐng)問各位大神這是怎么回事
我用STM32F103C8T6的串口1發(fā)送數(shù)據(jù),同時(shí)配置TIM1_CH1讓PA8產(chǎn)生PWM波形,在main.c中進(jìn)行初始化發(fā)現(xiàn):
1、同時(shí)初始化uart_init();和pwm_init();后發(fā)現(xiàn)沒有PWM波產(chǎn)生
2、只初始化pwm_init();后PA8有PWM波形產(chǎn)生
請(qǐng)問各位大神這是什么原因?
main.c中只初始化pwm_init();可以產(chǎn)生PWM波
單片機(jī)源程序如下:
#include <stm32f10x.h>
#include "uart.h"
#include "pwm.h"
int main(void)
{
//uart_init(); //115200
pwm_init();
//printf("Hello STM32!\r\n");
while(1)
{
TIM_SetCompare1(TIM1,50);
}
}
復(fù)制代碼
uart.c 串口1的配置
#include "uart.h"
void uart_init(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//使能端口時(shí)鐘 TXD RXD GPIO PA10 PA9
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//使能串口1時(shí)鐘 APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* 配置RXD引腳 PA10 浮空輸入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置TXD PA9 復(fù)用推挽輸出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200; //配置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位數(shù)據(jù)位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //無奇偶校驗(yàn)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無需硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//全雙工 既可以發(fā)送也可以接收
/* 初始化USART1 */
USART_Init(USART1, &USART_InitStructure);
/* 使能串口工作 */
USART_Cmd(USART1, ENABLE);
}
void send_byte(uint8_t byte)
{
USART_SendData(USART1, byte);
/* 等待發(fā)送完成 */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
}
void send_string(uint8_t *str)
{
while(*str != '\0')
{
send_byte(*str++);
}
}
void send_buf(uint8_t *buf,uint16_t len)
{
uint16_t i;
for(i = 0;i < len;i++)
{
send_byte(buf[i]);
}
}
int fputc(int ch,FILE *f)
{
send_byte(ch);
return(ch);
}
復(fù)制代碼
pwm.c PWM中TIM1_CH1的配置
#include "pwm.h"
void pwm_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//使能TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* GPIOA 端口時(shí)鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//PA8 配置復(fù)用推挽輸出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 定時(shí)器配置 產(chǎn)生頻率 50HZ-60HZ 100HZ */
TIM_TimeBaseStructure.TIM_Period = 10000/100 - 1; //計(jì)數(shù)值 范圍0 - 99
TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; //72MHZ/7200 = 10 000
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* PWM1 模式配置:TIM1_CH1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM輸出使能
TIM_OCInitStructure.TIM_Pulse = 0; //設(shè)置比較值 比較值決定了占空比 值得范圍由計(jì)數(shù)值決定
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
//使能預(yù)裝載寄存器
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
//使能自動(dòng)重裝載寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE);
/* 使能TIM1計(jì)數(shù) */
TIM_Cmd(TIM1, ENABLE);
}
復(fù)制代碼
作者:
yzwzfyz
時(shí)間:
2023-4-20 15:39
串口發(fā)送需要一個(gè)時(shí)鐘源,決定每間隔多久發(fā)送一位。
PWM也需要一個(gè)時(shí)鐘源,來計(jì)數(shù)脈沖,以決定數(shù)多少個(gè)出1,再數(shù)多少個(gè)出0。
如果你用的是同一個(gè)時(shí)間源,就必須保證兩者之間不會(huì)產(chǎn)生矛盾。這是數(shù)學(xué)問題你可以算算。
例如:串行波特率是1000,即1ms移一位。
PWM:周期=10ms,則占空比只能是:1:9,1:4,3:7,2:3,1:1。再細(xì)就分不過來。
如果希望互不受牽制,就用兩個(gè)不同的時(shí)鐘源。
作者:
人中狼
時(shí)間:
2023-4-20 15:45
應(yīng)該是代碼問題,PWM的占空比設(shè)置一次就可以了,不用放在while(1)里
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1