串口实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《嵌入式系统开发》课程实验报告
班级:电信141
*名:***
学号: *********
实验日期: 5月6日
电子通信工程系
实验一串口通信实验
学时安排:2学时
一、实验目的:
1、熟悉STM32的编程环境的使用;
2、掌握STM32的串口的编程;
二、实验步骤:
1.在keil环境下编辑源文件,并编译。
2.在野火STM32实验板上运行,调试程序,观察实验现象,理解并掌握相关知识。
3.编写STM32 的串行通信程序,实现由串口调试助手输入任意字符串,STM接收后返回到串
口调试助手输出。
三、实验内容:
设计思路及程序代码。
1、建立工程,编写主要代码
2、时钟配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
3、GPIOA配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // USART1_TX (PA.9)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX (PA.10)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10
4、USART 初始化设置
USART_ART_BaudRate = bound;//一般设置为9600;
USART_ART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_ART_StopBits = USART_StopBits_1;//一个停止位
USART_ART_Parity = USART_Parity_No;//无奇偶校验位
USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(USART1, ENABLE); //使能串口
5、串口中断初始化函数
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成{
if(USART_RX_STA&0x4000)//接收到了0x0d{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D{
if(Res==0x0d)USART_RX_STA|=0x4000;
else{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
} } }
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();
#endif }
7、在main函数编写
int main(void) {
u8 t;
u8 len;
delay_init(); //延时函数初始化
NVIC_Configuration(); // 设置中断优先级分组
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
while(1) {
if(USART_RX_STA&0x8000) { //接收完毕
len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n");
for(t=0;t USART_SendData(USART1,USART_RX_BUF[t]); //发送一个字节的数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); } //等待发送结束LED1=!LED1; delay_ms(200); LED1=!LED1; printf("\r\n\r\n"); //插入换行 USART_RX_STA=0; } else{ printf("请输入数据,以空格键结束\r\n"); delay_ms(15000); } } } 四、实验结果: 通过本次试验,经过一次次失败后,终于完成了串口实验;最重要的不是作出实验结果,而是你在实验结果中学会到了什么,排出困难,通过解决困难,才能学到真正的知识。学到的不仅仅是知识,还有团结和互助最重要的,学会了做实验要仔细,这样就可以避免一些不必要的麻烦,也养成了良好的习惯。