1. 程式人生 > >STM32的串列埠傳送資料(字元,字串,數字.......)(重點)

STM32的串列埠傳送資料(字元,字串,數字.......)(重點)

#include "stm32f10x.h"
#include <stdio.h>    //下面strlen函式需要此標頭檔案
#include "USART.h"

/**********************************************************
** 函式名:u32tostr
** 功能描述: 將一個32位的變數dat轉為字串,比如把1234轉為"1234"
** 輸入引數: dat:帶轉的long型的變數
             str:指向字元陣列的指標,轉換後的位元組串放在其中 
** 輸出引數: 無
***********************************************************/
void u32tostr(unsigned long dat,char *str) 
{
    char temp[20];
    unsigned char i=0,j=0;
    i=0;
    while(dat)
    {
        temp[i]=dat%10+0x30;
        i++;
        dat/=10;
    }
    j=i;
    for(i=0;i<j;i++)
    {
          str[i]=temp[j-i-1];
    }
    if(!i) {str[i++]='0';}
    str[i]=0;
}
/**********************************************************
** 函式名: strtou32
** 功能描述: 將一個字串轉為32位的變數,比如"1234"轉為1234
** 輸入引數: str:指向待轉換的字串     
** 輸出引數: 無
** 返回:轉換後的數值  
***********************************************************/
unsigned long strtou32(char *str) 
{
    unsigned long temp=0;
    unsigned long fact=1;
    unsigned char len=strlen(str);
    unsigned char i;
    for(i=len;i>0;i--)
    {
        temp+=((str[i-1]-0x30)*fact);
        fact*=10;
    }
    return temp;
}
/**********************************************************
** 函式名: Usart_Configuration
** 功能描述: 串列埠1配置, 包括串列埠時鐘,GPIO配置
** 輸入引數: 無
** 輸出引數: 無
***********************************************************/
void Usart_Configuration(void)
{
     GPIO_InitTypeDef GPIO_InitStructure; //GPIO庫函式結構體
     USART_InitTypeDef USART_InitStructure;//USART庫函式結構體
     USART_ClockInitTypeDef USART_ClockInitStructure;
     //使能串列埠1,GPIOA,AFIO匯流排
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);
     /* Configure USART1 Tx (PA9) as alternate function push-pull */
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//PA9時鐘速度50MHz
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複用輸出
     GPIO_Init(GPIOA, &GPIO_InitStructure);
     /* Configure USART1 Rx (PA10) as input floating */
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉輸入
     GPIO_Init(GPIOA, &GPIO_InitStructure);
     
     USART_InitStructure.USART_BaudRate =115200; //波特率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; //傳送、接收使能
    
     USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
     USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;//空閒時鐘為低電平
     USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;//時鐘第二個邊沿進行資料捕獲
     USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;//最後一位資料的時鐘脈衝不從SCLK輸出
    
     USART_ClockInit(USART1, &USART_ClockInitStructure);
     USART_Init(USART1, &USART_InitStructure);    //初始化結構體
     USART_Cmd(USART1, ENABLE); //使能串列埠1    
}

//加入以下程式碼,支援printf函式,而不需要選擇use MicroLIB      
/***************************START*********************/
#if 1
#pragma import(__use_no_semihosting)             
//標準庫需要的支援函式                 
struct __FILE 

    int handle; 
    /* Whatever you require here. If the only file you are using is */ 
    /* standard output using printf() for debugging, no file handling */ 
    /* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
FILE __stdout;       
//定義_sys_exit()以避免使用半主機模式    
_sys_exit(int x) 

    x = x; 

//重定義fputc函式 
int fputc(int ch, FILE *f)
{      
    USART1->DR = (u8) ch;      
    while((USART1->SR&0X40)==0);//迴圈傳送,直到傳送完畢   
    return ch;
}
#endif 
/***************************END*********************/

/**********************************************************
** 函式名:USART1_Putc
** 功能描述: 串列埠1傳送一字元
** 輸入引數: c
** 輸出引數: 無
***********************************************************/
void USART1_Putc(unsigned char c)
{
    USART1->DR = (u8)c; //要傳送的字元賦給串列埠資料暫存器  
    while((USART1->SR&0X40)==0); //等待發送完成  
}
/**********************************************************
** 函式名:USART1_Puts
** 功能描述: 串列埠1傳送一字串
** 輸入引數: 指標str
** 輸出引數: 無
***********************************************************/
void USART1_Puts(char * str)
{
    while(*str)
    {
        USART1->DR= *str++;
        while((USART1->SR&0X40)==0);//等待發送完成  
    }
}
/**********************************************************
** 函式名:UART_Send_Enter
** 功能描述: 串列埠1傳送一換行符
** 輸入引數: 無
** 輸出引數: 無
***********************************************************/
void UART_Send_Enter(void)
{
    USART1_Putc(0x0d);
    USART1_Putc(0x0a);
}
/**********************************************************
** 函式名:UART_Send_Str
** 功能描述: 串列埠1傳送一字串,帶回車換行功能
** 輸入引數: 指標s
** 輸出引數: 無
***********************************************************/
void UART_Send_Str(char *s)
{
 
     for(;*s;s++)
     {
         if(*s=='\n') 
              UART_Send_Enter();
         else
              USART1_Putc(*s);
     }
}
/**********************************************************
** 函式名: UART_Put_Num
** 功能描述: STM32F的USART傳送數值
** 輸入引數: dat:要傳送的數值
** 輸出引數: 無
** 說明:函式中會將數值轉為相應的字串,傳送出去。比如 4567 轉為 "4567" 
***********************************************************/
void UART_Put_Num(unsigned long dat)
{
    char temp[20];
    u32tostr(dat,temp);
    UART_Send_Str(temp);
}
/**********************************************************
** 函式名: UART_Put_Inf
** 功能描述: STM32F的USART傳送除錯資訊
** 輸入引數: inf:指向提示資訊字串的指標
             dat:一個數值,前面的提示資訊就是在說明這個數值的意義
** 輸出引數: 無 
***********************************************************/
void UART_Put_Inf(char *inf,unsigned long dat)
{
    UART_Send_Str(inf);
    UART_Put_Num(dat);
    UART_Send_Str("\n");  
}