当前位置:首页 > 单片机 > 单片机
[导读]硬件平台:stm32F407Zet6软件平台:stm32cubeMX 4.7+MDK5.14电路连接:PA9,PA10第一步、通过Stm32CubeMX图形界面创建Keil工程需要配置的地方是在这里可以修改串口工作的一下参数,软件就可以生成配置好的工程,不需要

硬件平台:stm32F407Zet6

软件平台:stm32cubeMX 4.7+MDK5.14

电路连接:PA9,PA10

第一步、通过Stm32CubeMX图形界面创建Keil工程

需要配置的地方是



在这里可以修改串口工作的一下参数,软件就可以生成配置好的工程,不需要亲自去配置这些了。

第二步。打开工程,编写代码,验证

#include"stdio.h"

#ifdef__GNUC__

#definePUTCHAR_PROTOTYPEint__io_putchar(intch)

#else

#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f)

#endif

PUTCHAR_PROTOTYPE

{

HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xFFFF);

returnch;

}

这段程序为了可以使用printf()函数,对字符输出函数进行了重定向,这样我们就可以在程序中使用printf函数进行输出了,这里使用的是查询发送方式,有超时控制的。接下来来看中断方式的。

voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart)

{

uint32_ttmp1=0,tmp2=0;

tmp1=__HAL_UART_GET_FLAG(huart,UART_FLAG_PE);

tmp2=__HAL_UART_GET_IT_SOURCE(huart,UART_IT_PE);

if((tmp1!=RESET)&&(tmp2!=RESET))

{

__HAL_UART_CLEAR_PEFLAG(huart);

huart->ErrorCode|=HAL_UART_ERROR_PE;

}

tmp1=__HAL_UART_GET_FLAG(huart,UART_FLAG_FE);

tmp2=__HAL_UART_GET_IT_SOURCE(huart,UART_IT_ERR);

if((tmp1!=RESET)&&(tmp2!=RESET))

{

__HAL_UART_CLEAR_FEFLAG(huart);

huart->ErrorCode|=HAL_UART_ERROR_FE;

}

tmp1=__HAL_UART_GET_FLAG(huart,UART_FLAG_NE);

tmp2=__HAL_UART_GET_IT_SOURCE(huart,UART_IT_ERR);

if((tmp1!=RESET)&&(tmp2!=RESET))

{

__HAL_UART_CLEAR_NEFLAG(huart);

huart->ErrorCode|=HAL_UART_ERROR_NE;

}

tmp1=__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE);

tmp2=__HAL_UART_GET_IT_SOURCE(huart,UART_IT_ERR);

if((tmp1!=RESET)&&(tmp2!=RESET))

{

__HAL_UART_CLEAR_OREFLAG(huart);

huart->ErrorCode|=HAL_UART_ERROR_ORE;

}

tmp1=__HAL_UART_GET_FLAG(huart,UART_FLAG_RXNE);

tmp2=__HAL_UART_GET_IT_SOURCE(huart,UART_IT_RXNE);

if((tmp1!=RESET)&&(tmp2!=RESET))

{

UART_Receive_IT(huart);

}

tmp1=__HAL_UART_GET_FLAG(huart,UART_FLAG_TXE);

tmp2=__HAL_UART_GET_IT_SOURCE(huart,UART_IT_TXE);

if((tmp1!=RESET)&&(tmp2!=RESET))

{

UART_Transmit_IT(huart);

}

tmp1=__HAL_UART_GET_FLAG(huart,UART_FLAG_TC);

tmp2=__HAL_UART_GET_IT_SOURCE(huart,UART_IT_TC);

if((tmp1!=RESET)&&(tmp2!=RESET))

{

UART_EndTransmit_IT(huart);

}

if(huart->ErrorCode!=HAL_UART_ERROR_NONE)

{

huart->State=HAL_UART_STATE_READY;

HAL_UART_ErrorCallback(huart);

}

}

这个函数中查询了所有可能发生的中断。用到的中断是发送完成中断,就找到了UART_EndTransmit_IT(huart);再跳进去看看,

staticHAL_StatusTypeDefUART_EndTransmit_IT(UART_HandleTypeDef*huart)

{

__HAL_UART_DISABLE_IT(huart,UART_IT_TC);

if(huart->State==HAL_UART_STATE_BUSY_TX_RX)

{

huart->State=HAL_UART_STATE_BUSY_RX;

}

else

{

__HAL_UART_DISABLE_IT(huart,UART_IT_PE);

__HAL_UART_DISABLE_IT(huart,UART_IT_ERR);

huart->State=HAL_UART_STATE_READY;

}

HAL_UART_TxCpltCallback(huart);

returnHAL_OK;

}

这个函数在确定中断发生了之后调用了,HAL_UART_TxCpltCallback(huart);从函数名上可以看出,这是个回调函数,就是留给上层来实现的函数,由这个函数的实现不同,来实现不同的功能。这里来实现这个函数,让它在中断发生的时候吧USART1Ready置为SET;代码修改如下

#include"stdio.h"

#ifdef__GNUC__

#definePUTCHAR_PROTOTYPEint__io_putchar(intch)

#else

#definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f)

#endif

__IOITStatusUSART1Ready=RESET;

PUTCHAR_PROTOTYPE

{

HAL_UART_Transmit_IT(&huart1,(uint8_t*)&ch,1);

while(USART1Ready!=SET)

{

}

USART1Ready=RESET;

returnch;

}

这是重定向函数的修改,启动发送之后,等待发送完成。重新实现的回调函数如下图所示:

voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart)

{

USART1Ready=SET;

}


这样就可以了,下载验证。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭