我用STM32F103C8T6的串口1發送數據,同時配置TIM1_CH1讓PA8產生PWM波形,在main.c中進行初始化發現:
1、同時初始化uart_init();和pwm_init();后發現沒有PWM波產生
2、只初始化pwm_init();后PA8有PWM波形產生
請問各位大神這是什么原因?
main.c中只初始化pwm_init();可以產生PWM波
單片機源程序如下:
- #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);
- }
- }
復制代碼 uart.c 串口1的配置
- #include "uart.h"
- void uart_init(void)
- {
- USART_InitTypeDef USART_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
-
- //使能端口時鐘 TXD RXD GPIO PA10 PA9
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
- //使能串口1時鐘 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 復用推挽輸出模式 */
- 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位數據位
- 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;//全雙工 既可以發送也可以接收
- /* 初始化USART1 */
- USART_Init(USART1, &USART_InitStructure);
- /* 使能串口工作 */
- USART_Cmd(USART1, ENABLE);
- }
- void send_byte(uint8_t byte)
- {
- USART_SendData(USART1, byte);
- /* 等待發送完成 */
- 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);
- }
復制代碼 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 端口時鐘 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- //PA8 配置復用推挽輸出模式
- 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);
-
- /* 定時器配置 產生頻率 50HZ-60HZ 100HZ */
- TIM_TimeBaseStructure.TIM_Period = 10000/100 - 1; //計數值 范圍0 - 99
- TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; //72MHZ/7200 = 10 000
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式
- 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; //設置比較值 比較值決定了占空比 值得范圍由計數值決定
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
- TIM_OC1Init(TIM1, &TIM_OCInitStructure);
- //使能預裝載寄存器
- TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
-
- TIM_CtrlPWMOutputs(TIM1,ENABLE);
- //使能自動重裝載寄存器
- TIM_ARRPreloadConfig(TIM1, ENABLE);
- /* 使能TIM1計數 */
- TIM_Cmd(TIM1, ENABLE);
- }
復制代碼
|