新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2017-11-30
- 在线时间
- 4 小时
|
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]
|
|