亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
STM8L的USART1串口通信詳解 含例程
[打印本頁]
作者:
51hei小林
時間:
2016-10-10 00:57
標題:
STM8L的USART1串口通信詳解 含例程
STM8L除了可以進行串口通信,還可支持紅外通信,智能卡協議,這些功能后續會開發,發布程序源碼。STM8L還可以使用DMA緩存數據,減少CPU負擔,為了簡單起見,本文沒有用到DMA功能。
只需要簡單的
配置發送的字長度,停止位數,波特率,打開發送接收
,就可以進行串口數據收發。下圖為串口發送數據流程。
對于串口發送數據,需要注意的是,打開發送后,數據發送完成,如果不關閉中斷,程序會一直進入中斷。所以在確保數據發送完成后,需關閉中斷,退出發送數據。
本文通過周期性(500ms)的向上位機發送一組數據,來演示STM8L的串口通信。串口接收部分程序也已經調試好,只需把while循環中的程序注釋掉,設置斷點,查看上位機發送來的數據即可。
下圖為串口助手接收到STM8L每隔500ms發送過來的一組數據。
/****************************************************************************************
*開發環境:IAR for stm8 v1.40.1
*硬件平臺:STM8L-DISCOVERY
*功能說明:每隔500ms通過PC3引腳向上位機發送一組數據。串口配置為:波特為9600,8個數據位,1個停止位,無奇偶校驗。
*作 者:茗風
****************************************************************************************/
#include"iostm8l152c6.h"
#include"stdbool.h"
#include"stdint.h"
#define TXBUF_SIZE 9
#define RXBUF_SIZE 25
bool bTX_finished=false;
bool bRX_finished=false;//串口接收完一幀數據標志位
uint8_t ui8TX_number = 0;
uint8_t ui8RX_counter=0;
uint8_t ui8TX_buffer[TXBUF_SIZE]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
uint8_t ui8RX_buffer[RXBUF_SIZE];
/******************************************************************************************************
* 名 稱:void delay_10ms(uint8_t x_ms)
* 功 能:延時10ms
* 入口參數:無
* 出口參數:無
* 說 明:
* 范 例:無
******************************************************************************************************/
void delay_100ms(void)
{
uint8_t i,j;
for(i=0;i<255;i++)//2*255個指令周期
for(j=0;j<255;j++);//2*255個指令周期
//delay_10ms共消耗 x_ms*2*255+2*x_ms個指令周期
//255*2*255+2*255=130610us=130ms
//此延時函數,延時時間為130ms
//16M/8/2=1M 一個指令周期為1us
}
/******************************************************************************************************
* 名 稱:void UART_Init(void)
* 功 能:UART定時器初始化系統
* 入口 參數:無
* 出口 參數:無
* 說 明:UART初始化為 9600 1 8 n
* 范 例:無
******************************************************************************************************/
void UART_Init(void)
{
/*********************************/
PC_DDR_DDR2 =0;//輸入
PC_CR1_C12 =1;//上拉輸入
PC_CR2_C22 =0;
PC_ODR_ODR3 =1;
PC_CR1_C13 =1;//推挽輸出
PC_CR2_C23 =1;//輸出擺率10M
PC_DDR_DDR3 =1;//輸出高電平,TX空閑狀態為高電平,如果不設置,會莫名奇妙的發送0x00
CLK_PCKENR1_PCKEN15=1;//開啟USART外設時鐘
//開啟引腳的UART功能
//00: USART1_TX on PC3 and USART1_RX on PC2
//01: USART1_TX on PA2 and USART1_RX on PA3
//10: USART1_TX on PC5 and USART1_RX on PC6
SYSCFG_RMPCR1_USART1TR_REMAP =0;//PC2,PC3
//如果需要使用其他引腳作為串口發送接收引腳,請在這里選擇
//設置串口工作方式
USART1_CR1_M =0;//1 start bit,8 data bit,n stop bit
USART1_CR3_STOP0=0;USART1_CR3_STOP1=0;//1 stop bit
//設置波特率
//波特率設置為9600
// 2000000/9600=208 //2000000是此時系統的主時鐘頻率,默認8分頻,16M/8=2M
//208(DEC)=00D0(HEX)
USART1_BRR2 =0x00;//the BRR2 should be programmed before BRR1
USART1_BRR1 =0x0D;
// USART1_CR2_TEN=0;//使能發送
// USART1_CR2_TIEN=0;//打開發送中斷
USART1_CR2_REN=1;//使能接收
USART1_CR2_RIEN=1;//打開接收中斷
}
void main(void)
{
// GPIO_Init();
UART_Init();
asm("rim"); //enable interrupts
while(1)
{
ui8TX_number=9;
USART1_CR2_TEN=1;//打開發送
USART1_CR2_TIEN=1;//打開發送中斷
delay_100ms();
delay_100ms();
delay_100ms();
delay_100ms();
// asm("wfi");
}
}
/*************************************************************************************************** ***
* 名 稱: UART_OnTx()
* 功 能: UART的Tx事件處理函數
* 入口參數:無
* 出口參數:無
* 說 明:發送ui8TX_buffer數組中的數據,發送完成后,置位bTX_finished標志位,下一次進入中斷后關閉發送
* 范 例:無
******************************************************************************************************/
#pragma vector=USART_T_TXE_vector
__interrupt void USART_TX_ISR (void)
{
static uint8_t cnts=0;
if(bTX_finished && USART1_SR_TC==1)
{
bTX_finished=false;
USART1_CR2_TIEN=0;//關閉發送中斷
USART1_CR2_TEN=0;//關閉發送
}
else if(USART1_SR_TC==1)
{
USART1_DR=ui8TX_buffer[cnts++];
if(cnts==ui8TX_number)
{
cnts=0;
bTX_finished=true;
}
}
}
/******************************************************************************************************
* 名 稱: UART_OnRx()
* 功 能: UART的Tx事件處理函數
* 入口 參數:無
* 出口 參數:無
* 說 明:
* 范 例:無
******************************************************************************************************/
#pragma vector=USART_R_RXNE_vector
__interrupt void USART_RX_ISR(void)
{
static uint8_t ui8RX_temp=0;
if(USART1_SR_RXNE==1)
{
ui8RX_temp = USART1_DR;
}
}
復制代碼
作者:
大蝦你鞋掉了
時間:
2016-10-12 19:43
樓樓
,119行說開啟引腳的UART功能是 用I/O口模擬串口的意思嗎
作者:
12345@34
時間:
2020-4-28 15:36
為什么我的打開串口助手,只能發送,卻接收不到信息呢?
作者:
12345@34
時間:
2020-4-30 11:29
為什我的總是報錯說cannot open source file
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1