西安电子科技大学大二学生微控制器项目硬件实操详解
西安电子科技大学大二微控制器个人项目硬件实操部分
一. 题目要求
二. 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