本篇博文最后修改时间:2017年08月04日 18:29。
一、简介
本文以STM8S103F3P6编程为例,介绍STM8S103F3P6串口中断发送。
二、实验平台
电脑平台:Windows7 64位旗舰
编译软件:IAR
硬件平台:STM8S103F3P6
三、版权声明
博主:_懵懂
声明:此博客仅供参考不做任何商业用途,最终解释权归原博主所有。
原文地址:http://blog.csdn.NET/qq_18842031
懵懂之MCU交流群:136384801
四、实验前提
1、在进行本文步骤前,请先安装IAR EWSTM8-EV-1311版本;准备好STM8S103F3P6硬件平台。
五、基础知识
暂无
六、源码地址
暂无
七、实验内容
1.系统时钟初始化为内部16M】
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //时钟 初始化时钟为1分频 16M 2分频8M
2.初始化串口
void Init_UART1(void)
{
UART1_DeInit(); //恢复串口所有寄存器
UART1_Init((u32)9600, //波特率9600
UART1_WORDLENGTH_8D, //8位
UART1_STOPBITS_1, //停止位1
UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE,
UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); //使能接收中断
// UART1_ITConfig(UART1_IT_TC, ENABLE); //使能发送中断 发送中断使能是那里需要才使能
UART1_Cmd(ENABLE);
}
3.编写查询方式发送数据入口
void UART1_Send(uint8_t *dat,uint8_t len)
{
uint8_t i = 0;
for(i=0; i<len; i++)
{
while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
UART1_SendData8(*dat++);
}
}
4.编写中断方式发送数据入口
uint8_t Rxd_buf[20]; //接收数组
uint8_t Rxd_len; //接收长度
uint8_t Rxd_F; //接收标志位
uint8_t Txd_buf[20]; //发送数组
uint8_t Txd_len; //发送长度
uint8_t Txd_F; //发送标志位
void Send(uint8_t dat)
{
while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
UART1_SendData8(dat);
}
uint8_t Set_UART1Interrupt(uint8_t *lV_dat,uint8_t lV_len)
{
if(Txd_len != 0)
{
return FALSE;
}
for(Txd_len=0;Txd_len <lV_len;Txd_len++) //将数据装到全局变量中
Txd_buf[Txd_len]=lV_dat[Txd_len];
UART1_ITConfig(UART1_IT_TC, ENABLE); //使能发送中断
return TRUE;
}
5.编写主函
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //内部时钟16M
Init_UART1();
enableInterrupts();
UART1_Send("Hi\n",3); //查询发送
Set_UART1Interrupt("Hello\n",6); //中断发送数据
while(1);
}
6.编写中断服务函数
INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
{
static uint8_t lV_num; //记录已经发送数据的长度
Send(Txd_buf[lV_num++]);
if(lV_num == Txd_len) //发送数据的长度和需要发送数据的长度相等 就关闭发送中断
{
lV_num = 0;
(void) memset(Txd_buf,0,Txd_len);
Txd_len = 0;
UART1_ITConfig(UART1_IT_TC, DISABLE); //禁止发送中断
}
return;
}