1. 程式人生 > >串口發送代碼講解

串口發送代碼講解

兩個 put p s 初始化 clu control 流控 文件夾 開發

新建bsp_usart.c和bsp_usart.h,添加到工程,魔術棒添加頭文件所在的文件夾.

bsp_usart.c

#include "bsp_usart.h"

void USART_Config(void)
 {
     GPIO_InitTypeDef GPIO_InitStructure;
     USART_InitTypeDef USART_InitStructure;

    // 打開串口GPIO的時鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
     
     // 打開串口外設的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 將USART Tx的GPIO配置為推挽復用模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
// 將USART Rx的GPIO配置為浮空輸入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置串口的工作參數 // 配置波特率 USART_InitStructure.USART_BaudRate = 115200; // 配置 針數據字長 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(USART1, &USART_InitStructure); // 使能串口 USART_Cmd(USART1, ENABLE); } /* 發送一個字節 8 位*/ /*STM32 USART只能一次發送8位*/ void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data) { USART_SendData(pUSARTx, data); while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET ); } /* 發送兩個字節的數據 * 16位*/ /*分兩次發送*/ void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data) { uint8_t temp_h,temp_l;/*高低8位*/ temp_h = (data&0xff00) >> 8 ; temp_l = data&0xff; /*先發送高8位*/ USART_SendData(pUSARTx, temp_h); while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET ); /*在發送低8位*/ USART_SendData(pUSARTx, temp_l); while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET ); } /* 發送8位數據的數組 */ void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num) { uint8_t i; for( i=0; i<num; i++ ) { Usart_SendByte(pUSARTx, array[i]); } //發送8位是判讀,TXE,大於8位判斷TC while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET ); } /* 發送字符串 */ void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str) { uint8_t i=0; do { Usart_SendByte(pUSARTx, *(str+i)); i++; }while(*(str+i) != \0); while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET ); } ///重定向c庫函數printf到串口,重定向後可使用printf函數 int fputc(int ch, FILE *f) { /* 發送一個字節數據到串口 */ USART_SendData(USART1, (uint8_t) ch); /* 等待發送完畢 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return (ch); }

bsp_usart.h

#ifndef __BSP_USART_H
 #define __BSP_USART_H

#include "stm32f10x.h"
 #include <stdio.h>

void USART_Config(void);
 void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
 void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data);
 void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num);
 void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str);



#endif 

main.c

#include "stm32f10x.h"   // 相當於51單片機中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_exit.h"
#include "bsp_usart.h"



int main(void)
{
    // 來到這裏的時候,系統的時鐘已經被配置成72M。

//USART和上位機交互
    uint8_t a[10]={100,2,3,4,5,6,7,8,9,10};//聲明必須在前面
    USART_Config();
    
    //默認發送的是字符,當不是字符時候,會自動將其轉換成相對於的ASCII值 100對應d 
    //當然你也可以這樣 ‘A‘ 當然你也可以在上位機上選擇16進制
    //Usart_SendByte(USART1, 100);
    //Usart_SendByte(USART1,‘A‘);
    
    //Usart_SendHalfWord(USART1, 0xff56);
    //printf( "串口printf函數測試\n" );
    
    //Usart_SendStr(USART1, "歡迎使用秉火STM32F103開發板 \n");
    
    
    Usart_SendArray(USART1, a,10);
    
    
    
    
    
  while(1){
        
    }
}

串口發送代碼講解