您现在的位置是:首页 >技术杂谈 >20230426 cortex-A7 cortex-M4核综合实验网站首页技术杂谈
20230426 cortex-A7 cortex-M4核综合实验
简介20230426 cortex-A7 cortex-M4核综合实验
cortex-M4核综合实验
1.通过配置开发板LED1/LED2/LED3三盏灯
2.当KEY1/KEY2/KEY3/光电开关/火焰传感器/人体红外中断触发,需要完成以下内容
1)中断触发,在串口工具打印一句话
2)中断触发,对应LED灯状态取反
3.需求:实验中的内容,需要在一个工程下配置,代码编写
usart.h
/* USER CODE BEGIN 0 */
int fputc(int ch,FILE *stream){
while(!(huart4.Instance->ISR & (0X1 << 7)));
huart4.Instance->TDR=ch;
if(ch == '
')
{
while(!(huart4.Instance->ISR & (0X1 << 7)));
huart4.Instance->TDR='
';
}
return ch;
}
/* USER CODE END 0 */
gpio.c
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
switch(GPIO_Pin){
case GPIO_PIN_15:
//光电开关
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);
printf("led3####
");
break;
case GPIO_PIN_5:
//火焰
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
printf("led2####
");
break;
case GPIO_PIN_12:
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_10);
printf("led1####
");
break;
}
}
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
switch(GPIO_Pin){
case GPIO_PIN_9:
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);
printf("led3####
");
break;
case GPIO_PIN_7:
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
printf("led2####
");
break;
case GPIO_PIN_8:
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_10);
printf("led1####
");
break;
}
}
/* USER CODE END 2 */
cortex-A7核综合实验
实验需求:在串口输入相应的命令,控制对应的硬件进行操作
在串口输入led1on------>板子LED1灯点亮
在串口输入led1off------>板子LED1灯熄灭
在串口输入led2on------>板子LED2灯点亮
在串口输入led2off------>板子LED2灯熄灭
在串口输入led3on------>板子LED3灯点亮
在串口输入led3off------>板子LED3灯熄灭
main.c
#include "led.h"
#include "uart4.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1800; j++)
;
}
typedef struct
{
char cmd_arr[20]; //命令字符串
gpio_t *gpiox; //gpio组号
unsigned int pin; //对应引脚编号
gpio_status_t status; //对应引脚状态
void (*gpio_write)(gpio_t *gpiox, unsigned int pin, gpio_status_t status);
} cmd_t;
cmd_t arr[6] = {
[0] = {
.cmd_arr = "led1on",
.gpiox = GPIOE,
.pin = GPIO_PIN_10,
.status = GPIO_SET_T,
.gpio_write = hal_gpio_write,
},
[1] = {
.cmd_arr = "led1off",
.gpiox = GPIOE,
.pin = GPIO_PIN_10,
.status = GPIO_RESET_T,
.gpio_write = hal_gpio_write,
},
[2] = {
.cmd_arr = "led2on",
.gpiox = GPIOF,
.pin = GPIO_PIN_10,
.status = GPIO_SET_T,
.gpio_write = hal_gpio_write,
},
[3] = {
.cmd_arr = "led2off",
.gpiox = GPIOF,
.pin = GPIO_PIN_10,
.status = GPIO_RESET_T,
.gpio_write = hal_gpio_write,
},
[4] = {
.cmd_arr = "led3on",
.gpiox = GPIOE,
.pin = GPIO_PIN_8,
.status = GPIO_SET_T,
.gpio_write = hal_gpio_write,
},
[5] = {
.cmd_arr = "led3off",
.gpiox = GPIOE,
.pin = GPIO_PIN_8,
.status = GPIO_RESET_T,
.gpio_write = hal_gpio_write,
},
};
//字符串比较函数
int strcmp(const char *str1, const char *str2)
{
while (*str1 && *str2 && *str1 == *str2)
{
str1++;
str2++;
}
return *str1 - *str2;
}
//查找命令的
cmd_t *find_cmd(const char *buffer)
{
int i;
for (i = 0; i < 6; i++)
{
if (strcmp(arr[i].cmd_arr, buffer) == 0)
{
return arr + i;
}
}
return 0;
}
int main()
{
//LED123灯初始化
hal_init_led123();
//UART初始化
hal_uart_init();
char buf[50];
int len = 50;
while (1)
{
hal_recv_string(buf, len); //用来接收串口工具输入的字符串
cmd_t *p = find_cmd(buf);
if (p == 0)
{
printf("cmd not found
");
}
else
{
p->gpio_write(p->gpiox, p->pin, p->status);
}
}
return 0;
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。