项目案例:串口单字节命令控制灯光开关切换
硬件资源:1个LED灯。
D3灯 <——– PC1。
串行接口UART2。
硬件电路相关信息,详见:XMF06A开发的电路结构框图。
功能要求:
1. 系统的主时钟采用默认的高速内部振荡器8分频,即2MHz。
2. 串行接口UART2的波特率为9600BSP,1位起始位,8位数据位,1位停止位。
3. 串口的数据发送采用查询方式,串口数据的接收采用中断方式。
4. 系统上电开机后,首先向上位机发送字符串“欢迎使用XMF06A开发板!”,回车换行。
6. 在主函数中轮询控制命令字变量,当收到上位机的单字节命令0xa3,则切换D3灯的开关状态,并返回执行信息“D3灯开关切换成功!”,回车换行。
案例的参考源码及注释
#include "iostm8s105k6.h"
#define D3 PC_ODR_ODR1
unsigned char Recv_dat = 0;
/*========================GPIO端口初始化=========================*/
void Init_GPIO()
{
//初始化D3灯的PC1引脚
PC_DDR |= 0x02; //PC1设置为输出模式
PC_CR1|= 0x02; //PC1设置为推挽输出
PC_CR2&= ~0x02; //PC1输出速度最大为2MHz
}
/*=======================串口UART2初始化=========================*/
void Init_UART2()
{
asm("rim"); //打开总中断
//在默认的2MHz时钟源下,波特率:9600
//UART_DIV = 2000000/9600 = 208 = 0x0d00
UART2_BRR2 = 0x00; //必须先写BRR2
UART2_BRR1 = 0x0d; //再写BRR1
UART2_CR2 = 0x2c; //允许接收和发送,使能接收中断
asm("rim"); //打开总中断
}
/*=====================串口发送单字节函数========================*/
void UR2_Send_Byte(unsigned char dat)
{
while((UART2_SR & 0x80)==0x00);
UART2_DR = dat; //发送一个字节
}
/*======================串口发送字符串函数=======================*/
void UR2_Send_String(unsigned char *str )
{
while(*str != '\0') //发送一个字符串
{
UR2_Send_Byte(*str++); //逐个发送字符串中的字节
}
}
/*====================UART2接收中断服务函数======================*/
#pragma vector= UART2_R_OR_vector
__interrupt void UART2_R_OR_IRQHandler()
{
Recv_dat = UART2_DR; //将接收到的数据读取出来
}
/*===========================主函数==============================*/
void main()
{
Init_GPIO(); //初始化GPIO端口
Init_UART2(); //初始化UART2
UR2_Send_String("欢迎使用XMF06A开发板\r\n");
while(1)
{
if(Recv_dat == 0xa3) //如果接收到的数据为0xa3命令字
{
D3 = ~D3; //切换D3灯的开关状态
UR2_Send_String("D3灯开关切换成功!\r\n");
Recv_dat = 0; //清除命令字变量
}
}
}