日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]最近開始使用stm8s103k3單片機了。據(jù)說很好,確實不錯。前幾天已經(jīng)試過了GPIO,Timer2,ADC的功能,都比較容易,唯獨串口UART使用,破費周折,寫出來,供大家借鑒。我使用的是stm8s103k3,32腳單片機,這個使用手冊上

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

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

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

2、軟件設置

(1)發(fā)送數(shù)據(jù)配置

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

main.c程序如下:


#include "stm8s103k.h"

void UART1_Init(void)
{
UART1_CR2=0x00;//使發(fā)送禁用TEN=0;
UART1_CR1=0x00;//設置M字長,8位數(shù)據(jù)位
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));//發(fā)送寄存器數(shù)據(jù)是否轉移完

UART1_CR2=0x00;//a處
UART1_DR=0xB6;//要發(fā)送的數(shù)據(jù)
UART1_CR2=0x08;//b處

while((UART1_SR & 0x40) ==0);//發(fā)送是否完成

}
}

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

(2)接收數(shù)據(jù)

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

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接收中斷函數(shù):
@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來設置



本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉