您现在的位置是:首页 >技术杂谈 >20230426 cortex-A7 cortex-M4核综合实验网站首页技术杂谈

20230426 cortex-A7 cortex-M4核综合实验

usux8025 2023-07-02 00:00:03
简介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;

}


风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。