一.中断模式编程
用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
1.STM32cubeMx项目创建
1.新建项目,选择芯片为STM32F103C8 2.设置引脚 3.记得勾选此处 4.设置工程名称和此处 5.点击创建项目,生成项目如下:
2.Keil修改代码
1.通过stm32f1xx_it.c文件中的EXTI9_5_IRQHandler函数f12跳转至stm32f1xx_hal_gpio.c文件找到HAL_GPIO_EXTI_Callback函数并修改
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == SWITCH_Pin){
GPIO_PinState pinState = HAL_GPIO_ReadPin(SWITCH_GPIO_Port,SWITCH_Pin);
if(pinState==GPIO_PIN_RESET)
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(LED_A4_GPIO_Port,LED_A4_Pin,GPIO_PIN_SET);
}
}
2.进行烧录
3.运行结果
二.串口中断
1.STM32cubeMx创建项目
2.Keil修改代码
1.重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(c=='0'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, 12,0xFFFF);
}
else if(c=='1'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, 12,0xFFFF);
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
2.修改main函数中的while循环
if(flag==1){
HAL_UART_Transmit(&huart1, (uint8_t *)&message, 10,0xFFFF);
HAL_Delay(1000);
}
3.main函数中设置接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
4.定义全局变量
char c;
char message[]="hello!\n";
char tips1[]="Start.....\n";
char tips2[]="Stop......\n";
int flag=0;
3.烧录并运行程序
三、DMA方式
1.stm32cubeMX创建项目过程
1.rcc设置 2.设置串口 3.点击dma设置 4.添加rxtx两个通道
2.代码修改
修改main函数
int main(void)
{
HAL_Init();
uint8_t message[] = "Hello DMA!\n";
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)message, sizeof(message));
HAL_Delay(1000);
}
}
3.烧录并运行结果
四.总结
通过本次实验,我了解到DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
五.参考链接
https://blog.csdn.net/m0_51120713/article/details/121179281?spm=1001.2014.3001.5501. https://blog.csdn.net/m0_51120713/article/details/121179281?spm=1001.2014.3001.5501. https://blog.csdn.net/qq_47281915/article/details/121063896?spm=1001.2014.3001.5501.
|