久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> STM32 >> 瀏覽文章

stm8s串口通信(uart)

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月09日   【字體:

    最近開始使用stm8s103k3單片機了。據說很好,確實不錯。前幾天已經試過了GPIO,Timer2,ADC的功能,都比較容易,唯獨串口UART使用,破費周折,寫出來,供大家借鑒。

     我使用的是stm8s103k3,32腳單片機,這個使用手冊上說了UART1,UART2,UART3。但是引腳的功能圖上只有UART1,并且你打開 stm8s103k.h的頭文件,里面也只有UART1寄存器的定義說明。所以我認為只有UART1。既然有這個功能,那就用吧,我以為直接可以連接到電腦的串口(COM1),就可以使用了,其實不可以。單片機即使寫著提供UART通訊功能,也要連接MAX232轉接芯片,我就在這里耽誤了許多時間。

    1、使用stm8s103上的串口和計算機com口通許的硬件連接:

 


 

     2、軟件設置

      (1)發送數據配置

1)編程UART_CR1的M位來定義字長。
2)在UART_CR3中編程停止位的位數。
3)按下列順序編寫波特率寄存器選擇要求的波特率。
       a)UART_BRR2
       b)UART_BRR1
4)設置UART_CR2中的TEN位來使能發送
5)把要發送的數據寫進UART_DR寄存器

 main.c程序如下:


#include "stm8s103k.h"

void UART1_Init(void)
{
    UART1_CR2=0x00;//使發送禁用TEN=0;
    UART1_CR1=0x00;//設置M字長,8位數據位
    UART1_CR3=0x00;//1位停止位
 
    UART1_BRR2=0x00;//00-0d:9600(fcpu=fmaster=2MHz)
    UART1_BRR1=0x0d;//00-1a:4800; 01-34:2400
 
    UART1_CR2=0x08;
}
main()
{
   //fmaster=fcpu=2MHz
   CLK_ECKR=0x00;
   CLK_ICKR=0x01;
   CLK_CMSR=0xe1;
 
   CLK_SWR=0xe1;
   CLK_CKDIVR=0x18;
 
   UART1_Init();
 
   while (1)
  {
      unsigned char i;
 
      while(!(UART1_SR & 0x80));//發送寄存器數據是否轉移完
  
     UART1_CR2=0x00;//a處
     UART1_DR=0xB6;//要發送的數據
     UART1_CR2=0x08;//b處
  
     while((UART1_SR & 0x40) ==0);//發送是否完成
 
  }
}

上面的代碼是我反復實驗過的,如果不加a和b處代碼,則接收的數據不穩定,比如發送5,接收到的數據的串口多次開閉,則接收的數據可能是0xB6,或0x67,或0x3B.

(2)接收數據

1)編程UART_CR1的M位來定義字長。
2)在UART_CR3中編程停止位的位數。
3)按下列順序編寫波特率寄存器選擇要求的波特率。
      a)UART_BRR2
      b)UART_BRR1
4)設置UART_CR2中的REN位來使能接收
5)讀UART_DR寄存器
      a)查詢:查詢SR中標志位RXNE (讀數據寄存器非空)
      b)中斷:需使能CR2中的RIEN(接收中斷使能)

 

標志位查詢方式:
初始化:
void UART1_Init(void)
{
 UART1_CR1 = 0x00; //8bit
 UART1_CR3 = 0x00;//1 stop bit
 UART1_BRR2 = 0x01;
 UART1_BRR1 = 0x1A;//4800 baud rate
 UART1_CR2 = 0x04;//enable REN
}

Main()函數:

while (!(UART1_SR & 0x20));//Loop until the UART1 Receive Data Register is not empty
RxBuffer  = UART1_DR; //Store the received byte in RxBuffer

 


中斷方式:
初始化:
void UART1_Init(void)
{
 UART1_CR1 = 0x00; //8bit
 UART1_CR3 = 0x00;//1 stop bit
 UART1_BRR2 = 0x01;
 UART1_BRR1 = 0x1A;//4800 baud rate
 UART1_CR2 = 0x24;//enable REN and RIEN
}
UART1接收中斷函數:
@far @interrupt void UART1_RX_IRQHandler (void)
{
   RxBuffer = UART1_DR; //Store the received byte in RxBuffer
   return;
}
UART1接收中斷向量(設置中斷向量,即將中斷服務程序的入口填寫到中斷向量表中)
struct interrupt_vector const _vectab[] =
{
   ……
  {0x82, UART1_RX_IRQHandler},
   ……
}

(3)特別注意波特率的計算設置方式

波特率通過配置16位除法器UART_DIV來設置



 

 轉自:http://blog.sina.com.cn/s/blog_4e32d6820101ekry.html

關閉窗口

相關文章

主站蜘蛛池模板: 免费视频一区 | 特黄特色大片免费视频观看 | 91精品国产综合久久小仙女图片 | 成人av大全 | 欧美www在线观看 | 亚洲精品久久久9婷婷中文字幕 | 欧美高清视频 | 一级高清| 中文字幕亚洲精品 | 国产一区不卡 | 欧美综合自拍 | 国产精品久久久久久久久久久久 | 国产日韩欧美在线观看 | 欧美日韩三级 | 欧美在线色 | 日韩高清不卡 | 亚洲欧美中文字幕 | 欧美一区视频 | 天天操天天拍 | 欧美亚洲第一区 | 精品1区2区3区 | 久久er精品| 日韩中文字幕在线观看 | 一区二区三区精品视频 | 日韩中文不卡 | 精品亚洲一区二区 | 九九热在线观看视频 | 久久99这里只有精品 | 久久久久久网站 | 欧美久久久久久 | 中文字幕精品一区 | 99精品免费久久久久久久久日本 | 国产视频线观看永久免费 | 免费看黄视频网站 | 日本三级电影免费 | 一级在线观看 | 美女二区 | 免费观看的av毛片的网站 | 日韩精品一区二区三区中文在线 | 日韩精品一区二区三区视频播放 | 一级aaaaaa毛片免费同男同女 |