打印
[STM32F1]

关于 STM32F103的串口1,2,3,4,5总计5个串口的案例!<申请原创.....

[复制链接]
11877|65
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
東南博士|  楼主 | 2018-8-3 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于 STM32F103的串口1,2,3,4,5总计5个串口的案例!<申请原创.....
沙发
東南博士|  楼主 | 2018-8-3 09:40 | 只看该作者
STM32使用USART中断主要有一下几步:

1,定义中断结构体,和串口结构体

2,使能时钟

3,编写中断函数

4,使能中断

使用特权

评论回复
板凳
東南博士|  楼主 | 2018-8-3 09:41 | 只看该作者
1.空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的(会触发break中断)。

使用特权

评论回复
地板
東南博士|  楼主 | 2018-8-3 09:42 | 只看该作者
2.关于第二点有要铺垫的三个情况,datasheet中
"当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果IDLEIE位被设置将产生一个中断"
"空闲符号被视为完全由'1'组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位'1'的位数也包括了停止位的位数”        空闲符号的配图后面跟这一个低电平.
有人理解为只有收到下一个数据的起始位才会触发中断,这样理解是不对的,应该是数据后有空闲了一帧就会触发.

使用特权

评论回复
5
東南博士|  楼主 | 2018-8-3 09:42 | 只看该作者
3.清中断的方式感觉奇怪,使用函数USART_ClearITPendingBit( USART1, USART_IT_IDLE )清除不了中断的.我用的是3.5的库,查看函数说明,里面的@param参数并没有IDLE,后面的@note中,这样说:
"PE(Parity error),FE(Framing error),NE(Noise error),ORE(OverRun error) and IDLE(Idle line detected) pending bits are cleared by software sequence: a read operation to USART_SR register (USART_GetITStatus()) followed by a read operation to USART_DR register (USART_ReceiveData())."
我是通过语句"USART1->DR;"来清除IDLE中断的.

使用特权

评论回复
6
東南博士|  楼主 | 2018-8-3 09:42 | 只看该作者
// 串口1-USART1
#define  UART1_USARTx                  USART1
#define  UART1_UART_CLK                RCC_APB2Periph_USART1
#define  UART1_UART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  UART1_UART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  UART1_UART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  UART1_UART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
#define  UART1_UART_TX_GPIO_PORT       GPIOA
#define  UART1_UART_TX_GPIO_PIN        GPIO_Pin_9
#define  UART1_UART_RX_GPIO_PORT       GPIOA
#define  UART1_UART_RX_GPIO_PIN        GPIO_Pin_10
#define  UART1_UART_IRQ                USART1_IRQn
#define  UART1_UART_IRQHandler         USART1_IRQHandler

使用特权

评论回复
7
東南博士|  楼主 | 2018-8-3 09:42 | 只看该作者
// 串口2-USART2
#define  UART2_USARTx                  USART2
#define  UART2_UART_CLK                RCC_APB1Periph_USART2
#define  UART2_UART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  UART2_UART_BAUDRATE           115200
// USART GPIO 引脚宏定义
#define  UART2_UART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  UART2_UART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
#define  UART2_UART_TX_GPIO_PORT       GPIOA
#define  UART2_UART_TX_GPIO_PIN        GPIO_Pin_2
#define  UART2_UART_RX_GPIO_PORT       GPIOA
#define  UART2_UART_RX_GPIO_PIN        GPIO_Pin_3
#define  UART2_UART_IRQ                USART2_IRQn
#define  UART2_UART_IRQHandler         USART2_IRQHandler

使用特权

评论回复
8
東南博士|  楼主 | 2018-8-3 09:43 | 只看该作者
// 串口3-USART3
#define  UART3_USARTx                  USART3
#define  UART3_UART_CLK                RCC_APB1Periph_USART3
#define  UART3_UART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  UART3_UART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  UART3_UART_GPIO_CLK           (RCC_APB2Periph_GPIOB)
#define  UART3_UART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
#define  UART3_UART_TX_GPIO_PORT       GPIOB
#define  UART3_UART_TX_GPIO_PIN        GPIO_Pin_10
#define  UART3_UART_RX_GPIO_PORT       GPIOB
#define  UART3_UART_RX_GPIO_PIN        GPIO_Pin_11
#define  UART3_UART_IRQ                USART3_IRQn
#define  UART3_UART_IRQHandler         USART3_IRQHandler

使用特权

评论回复
9
東南博士|  楼主 | 2018-8-3 09:43 | 只看该作者
//串口4-UART4
#define  UART4_USARTx                  UART4
#define  UART4_UART_CLK                RCC_APB1Periph_UART4
#define  UART4_UART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  UART4_UART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  UART4_UART_GPIO_CLK           (RCC_APB2Periph_GPIOC)
#define  UART4_UART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
#define  UART4_UART_TX_GPIO_PORT       GPIOC
#define  UART4_UART_TX_GPIO_PIN        GPIO_Pin_10
#define  UART4_UART_RX_GPIO_PORT       GPIOC
#define  UART4_UART_RX_GPIO_PIN        GPIO_Pin_11
#define  UART4_UART_IRQ                UART4_IRQn
#define  UART4_UART_IRQHandler         UART4_IRQHandler

使用特权

评论回复
10
東南博士|  楼主 | 2018-8-3 09:43 | 只看该作者
//串口5-UART5
#define  UART5_USARTx                  UART5
#define  UART5_UART_CLK                RCC_APB1Periph_UART5
#define  UART5_UART_APBxClkCmd         RCC_APB1PeriphClockCmd
#define  UART5_UART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  UART5_UART_GPIO_CLK           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)
#define  UART5_UART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
#define  UART5_UART_TX_GPIO_PORT       GPIOC
#define  UART5_UART_TX_GPIO_PIN        GPIO_Pin_12
#define  UART5_UART_RX_GPIO_PORT       GPIOD
#define  UART5_UART_RX_GPIO_PIN        GPIO_Pin_2
#define  UART5_UART_IRQ                UART5_IRQn
#define  UART5_UART_IRQHandler         UART5_IRQHandler

使用特权

评论回复
11
東南博士|  楼主 | 2018-8-3 09:44 | 只看该作者
//串口接收数据的长度
#define  RX_len 255
//类型定义
enum Buf_now {Buf_A=0,Buf_B=1}; //使用枚举类型定义了Con_Flag.U1_Buf_Now,用来指示现在使用的是哪个缓冲数组
//定义结构体
struct Flag
{
    unsigned int SYS_STEP_UART;
    u8 USER_USART_RX_Buf_A[RX_len];   //串口1数据接收缓存A
    u8 USER_USART_RX_Buf_B[RX_len];   //串口1数据接收缓存B
    u8 RCV_BUF[RX_len];   //串口1数据接收缓存B
    u8 Head_point;
    u8 IDLE_FLAG;
    int Num_Rx;                                                //单次总线空闲中断收到的数据个数
    enum Buf_now Buf_Now; //现在使用的数组
};
extern struct Flag UART1_Flag,UART2_Flag,UART3_Flag,UART4_Flag,UART5_Flag;

使用特权

评论回复
12
東南博士|  楼主 | 2018-8-3 09:44 | 只看该作者
//
void UART1_Config(void);
void UART2_Config(void);
void UART3_Config(void);
void UART4_Config(void);
void UART5_Config(void);
//
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);

使用特权

评论回复
13
東南博士|  楼主 | 2018-8-3 09:45 | 只看该作者
/**
  * @brief  USART GPIO 配置,工作参数配置
  * @param  无
  * @retval 无
  */
void UART1_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 打开串口GPIO的时钟
    UART1_UART_GPIO_APBxClkCmd(UART1_UART_GPIO_CLK, ENABLE);

    // 打开串口外设的时钟
    UART1_UART_APBxClkCmd(UART1_UART_CLK, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = UART1_UART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART1_UART_TX_GPIO_PORT, &GPIO_InitStructure);

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = UART1_UART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(UART1_UART_RX_GPIO_PORT, &GPIO_InitStructure);

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = UART1_UART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_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(UART1_USARTx, &USART_InitStructure);

    // 串口中断优先级配置
    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = UART1_UART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init(&NVIC_InitStructure);
    // 使能串口接收中断
    USART_ITConfig(UART1_USARTx,USART_IT_TC,DISABLE);  //关闭发送完成中断
    USART_ITConfig(UART1_USARTx,USART_IT_RXNE,ENABLE);  //关闭接收中断
    USART_ITConfig(UART1_USARTx,USART_IT_IDLE,ENABLE);//开启总线空闲中断
    // 使能串口
    USART_Cmd(UART1_USARTx, ENABLE);
}

使用特权

评论回复
14
東南博士|  楼主 | 2018-8-3 09:45 | 只看该作者
void UART2_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 打开串口GPIO的时钟
    UART2_UART_GPIO_APBxClkCmd(UART2_UART_GPIO_CLK, ENABLE);

    // 打开串口外设的时钟
    UART2_UART_APBxClkCmd(UART2_UART_CLK, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = UART2_UART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART2_UART_TX_GPIO_PORT, &GPIO_InitStructure);

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = UART2_UART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(UART2_UART_RX_GPIO_PORT, &GPIO_InitStructure);

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = UART2_UART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_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(UART2_USARTx, &USART_InitStructure);

    // 串口中断优先级配置
    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = UART2_UART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init(&NVIC_InitStructure);
    // 使能串口接收中断
    USART_ITConfig(UART2_USARTx,USART_IT_TC,DISABLE);  //关闭发送完成中断
    USART_ITConfig(UART2_USARTx,USART_IT_RXNE,ENABLE);  //关闭接收中断
    USART_ITConfig(UART2_USARTx,USART_IT_IDLE,ENABLE);//开启总线空闲中断
    // 使能串口
    USART_Cmd(UART2_USARTx, ENABLE);
}

使用特权

评论回复
15
東南博士|  楼主 | 2018-8-3 09:45 | 只看该作者
void UART3_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 打开串口GPIO的时钟
    UART3_UART_GPIO_APBxClkCmd(UART3_UART_GPIO_CLK, ENABLE);

    // 打开串口外设的时钟
    UART3_UART_APBxClkCmd(UART3_UART_CLK, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = UART3_UART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART3_UART_TX_GPIO_PORT, &GPIO_InitStructure);

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = UART3_UART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(UART3_UART_RX_GPIO_PORT, &GPIO_InitStructure);

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = UART3_UART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_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(UART3_USARTx, &USART_InitStructure);

    // 串口中断优先级配置
    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = UART3_UART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init(&NVIC_InitStructure);
    // 使能串口接收中断
    USART_ITConfig(UART3_USARTx,USART_IT_TC,DISABLE);  //关闭发送完成中断
    USART_ITConfig(UART3_USARTx,USART_IT_RXNE,ENABLE);  //关闭接收中断
    USART_ITConfig(UART3_USARTx,USART_IT_IDLE,ENABLE);//开启总线空闲中断
    // 使能串口
    USART_Cmd(UART3_USARTx, ENABLE);
}

使用特权

评论回复
16
東南博士|  楼主 | 2018-8-3 09:46 | 只看该作者
void UART4_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 打开串口GPIO的时钟
    UART4_UART_GPIO_APBxClkCmd(UART4_UART_GPIO_CLK, ENABLE);

    // 打开串口外设的时钟
    UART4_UART_APBxClkCmd(UART4_UART_CLK, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = UART4_UART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART4_UART_TX_GPIO_PORT, &GPIO_InitStructure);

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = UART4_UART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(UART4_UART_RX_GPIO_PORT, &GPIO_InitStructure);

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = UART4_UART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_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(UART4_USARTx, &USART_InitStructure);

    // 串口中断优先级配置
    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = UART4_UART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init(&NVIC_InitStructure);
    // 使能串口接收中断
    USART_ITConfig(UART4_USARTx,USART_IT_TC,DISABLE);  //关闭发送完成中断
    USART_ITConfig(UART4_USARTx,USART_IT_RXNE,ENABLE);  //关闭接收中断
    USART_ITConfig(UART4_USARTx,USART_IT_IDLE,ENABLE);//开启总线空闲中断
    // 使能串口
    USART_Cmd(UART4_USARTx, ENABLE);
}

使用特权

评论回复
17
東南博士|  楼主 | 2018-8-3 09:47 | 只看该作者
void UART5_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 打开串口GPIO的时钟
    UART5_UART_GPIO_APBxClkCmd(UART5_UART_GPIO_CLK, ENABLE);

    // 打开串口外设的时钟
    UART5_UART_APBxClkCmd(UART5_UART_CLK, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = UART5_UART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(UART5_UART_TX_GPIO_PORT, &GPIO_InitStructure);

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = UART5_UART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(UART5_UART_RX_GPIO_PORT, &GPIO_InitStructure);

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = UART5_UART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_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(UART5_USARTx, &USART_InitStructure);

    // 串口中断优先级配置
    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = UART5_UART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init(&NVIC_InitStructure);
    // 使能串口接收中断
    USART_ITConfig(UART5_USARTx,USART_IT_TC,DISABLE);  //关闭发送完成中断
    USART_ITConfig(UART5_USARTx,USART_IT_RXNE,ENABLE);  //关闭接收中断
    USART_ITConfig(UART5_USARTx,USART_IT_IDLE,ENABLE);//开启总线空闲中断
    // 使能串口
    USART_Cmd(UART5_USARTx, ENABLE);
}

使用特权

评论回复
18
東南博士|  楼主 | 2018-8-3 09:47 | 只看该作者
/*****************  发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
    /* 发送一个字节数据到USART */
    USART_SendData(pUSARTx,ch);

    /* 等待发送数据寄存器为空 */
    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}

使用特权

评论回复
19
東南博士|  楼主 | 2018-8-3 09:47 | 只看该作者
/****************** 发送8位的数组 ************************/
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)
{
    uint8_t i;

    for(i=0; i<num; i++)
    {
        /* 发送一个字节数据到USART */
        Usart_SendByte(pUSARTx,array[i]);

    }
    /* 等待发送完成 */
    while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);
}

使用特权

评论回复
20
東南博士|  楼主 | 2018-8-3 09:49 | 只看该作者
/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
    unsigned int k=0;
    do
    {
        Usart_SendByte( pUSARTx, *(str + k) );
        k++;
    } while(*(str + k)!='\0');

    /* 等待发送完成 */
    while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
    {}
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

382

主题

6081

帖子

34

粉丝