STM32学习笔记-配置串口,printf重定向

首先感谢河北科技大学航模协会-能给我这样的学习机会-感谢那些带我们教我们的学长学姐们.

串口的配置(以stm32f103c8t6串口1为例)

    USART_InitTypeDef chuanko;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    chuanko.USART_BaudRate=9600;
    chuanko.USART_WordLength=USART_WordLength_8b;
    chuanko.USART_StopBits=USART_StopBits_1;
    chuanko.USART_Parity=USART_Parity_No;
    chuanko.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    chuanko.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
    USART_Init(USART1,&chuanko);
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    USART_Cmd(USART1,ENABLE);
    USART_ClearFlag(USART1,USART_FLAG_TC);

USART_InitTypeDef串口结构体变量类型

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);打开apb2总线上的串口时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);打开apb2总线上的复用时钟

chuanko.USART_BaudRate=9600;串口波特率

波特率:模拟线路信号的速率,以波形每秒的振荡数来衡量。如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。

chuanko.USART_WordLength=USART_WordLength_8b;数据位数

chuanko.USART_StopBits=USART_StopBits_1;停止位数

chuanko.USART_Parity=USART_Parity_No;有无奇偶校验

chuanko.USART_HardwareFlowControl=USART_HardwareFlowControl_None;硬件流控制

chuanko.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;串口模式 发送 接收

USART_Init(USART1,&chuanko);传入结构体变量地址,配置串口

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);打开串口中断

USART_Cmd(USART1,ENABLE);使能串口1

USART_ClearFlag(USART1,USART_FLAG_TC);清空标志位

io初始化

  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 

  GPIO_Init(GPIOA, &GPIO_InitStructure);

void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    {	

        ......;
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    }

}

编写中断服务函数,每收到1字节数据进入一次中断服务函数

USART_ReceiveData(USART1);返回收到的数据

USART_SendData(USART1,数据);发送数据

printf重定向

printf是c语言标准输入输出库中的函数,只需修改它的输出到串口即可

包含stdio.h重载下面这个函数完成重定义

int fputc(int ch,FILE *f)
{

    USART_SendData(USART1,(u8)ch);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    return ch;
}

声明:转载请注明出处,本人入门级菜鸟,内容大多学习于网络,存在问题太多不一一列举,大佬多多指教.本人QQ941131649



你可能感兴趣的:(stm32)