西安电子科技大学大二学生微控制器项目硬件实操详解

西安电子科技大学大二微控制器个人项目硬件实操部分

一. 题目要求

二. cubemx配置

1. 设置debug方式

2. 设置串口


3. 设置LED灯IO口

4. 生成工程


三. keil代码编写

1. 串口重定向

int fputc(int ch , FILE *f)
{
	while((USART2->SR&0X40)==0);//循环发送,直到发送完毕
	USART2->DR = (uint8_t) ch;      
	return ch;
}

2. 定义变量

uint8_t rxBuffer[LENGTH]={0}; // 用于接收数据的缓冲区  
int digit10, digit11; 
uint8_t offDuration=0;	
int offTime=0;
int Flag=0;

3. 写串口中断函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    /* 判断是哪个串口触发的中断 */
    if(huart ->Instance == USART2)
    {
        //将接收到的数据再次发送给上位机
        printf("%s\r\n",rxBuffer);
		
        // 提取第10位和第11位字符,即学号的最后一位和倒数第二位,并转换为数字
		sscanf(&rxBuffer[9], "%1d", &digit10);
		sscanf(&rxBuffer[10], "%1d", &digit11);
		
		//灭灯时长为学号后两位差值,如果差值为0,则为 3
		offDuration = abs(digit11 - digit10); 
		 if (offDuration == 0)  
        offDuration = 3; 
		 
		 
		 //闪灯次数为末尾学号数,如果为 0,则取值为 5
		 if (digit11 == 0)  
        digit11 = 5;  
		
		 //灭灯时长ms数
		 offTime=offDuration*1000;
		 
		 // 打印结果
		 printf("count: %d time: %d\n", digit11, offDuration);
		 Flag=1;					//设置标志位为1,开始灯光闪烁
    }
	 //重新使能串口接收中断
        HAL_UART_Receive_IT(&huart2, (uint8_t*)rxBuffer, LENGTH);
}

4. while (1)之前

 printf("UART OK");\\检查状态
 HAL_UART_Receive_IT(&huart2, (uint8_t*)rxBuffer, LENGTH);\\开启中断

5. while (1)内部

while (1)
{
	if(Flag==1)//标志位为1,开始灯光闪烁
	{
		// 控制LED闪烁并通过串口发送状态  
		for (int i = 0; i < digit11; i++)  
		{  
		   //点亮LED2
			HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
			// 发送"On"到串口调试助手 
			printf("On\r\n");
			HAL_Delay(1000); // 灯亮一秒钟 
			 
	  
		   //熄灭LED2
			HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET );
			// 发送"Off"到串口调试助手  
			printf("Off\r\n"); 
			HAL_Delay(offTime); // 灭灯时长(秒数转换为毫秒)  
		
		}  

		Flag=0;//标志位为0,本次灯光闪烁结束
		
	}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

作者:聪明小熊猫12138

物联沃分享整理
物联沃-IOTWORD物联网 » 西安电子科技大学大二学生微控制器项目硬件实操详解

发表回复