《嵌入式系统开发》课程实验报告 班 级: 电 信141 姓 名: 冯 录 鹏 学 号: 140407112 实验日期: 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 //USART1_RX
(PA.10)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化PA10
4、USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数
据流控制
USART_InitStructure.USART_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;
//如果时钟节拍数定义了,说明要使用ucosII了.
#ifdef OS_TICKS_PER_SEC
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;
}
}
//如果时钟节拍数定义了,说明要使用ucosII了.
#ifdef OS_TICKS_PER_SEC
OSIntExit();
#endif }
7、在main函数编写
int main(void) {
u8 t; u8 len; delay_init();
//延时函数初始化 // 设置中断优先级分组 //串口初始化为9600
//初始化与LED连接的硬件接口
NVIC_Configuration(); uart_init(9600); LED_Init();
while(1) {
if(USART_RX_STA&0x8000) { } else{
len=USART_RX_STA&0x3fff;
//接收完毕
//得到此次接收到的数据长度
printf(\您发送的消息为:\\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(\ USART_RX_STA=0; //插入换行 } } printf(\请输入数据,以空格键结束\\r\\n\ delay_ms(15000); } 四、 实验结果: 通过本次试验,经过一次次失败后,终于完成了串口实验;最重要的不是作出实验结果,而是你在实验结果中学会到了什么,排出困难,通过解决困难,才能学到真正的知识。学到的不仅仅是知识,还有团结和互助最重要的,学会了做实验要仔细,这样就可以避免一些不必要的麻烦,也养成了良好的习惯。