EEDrone开源四旋翼从零开始(4)--DEMO开发
本贴来详细介绍下Demo工程的开发过程,Demo是完整功能的基础,也可以用来做测试。这里以UART功能DEMO为例,可以从零开始自己编写,也可以参考官方例程,也可以使用cubemx生成。
打开CubeMX,选择STM32F767ZITX芯片或者NUCLEOF767开发版,这两者的差别不大,选择开发板会多一些宏定义,然后在左边的串口3如下设置:
使用外部晶振
时钟设计如下:
串口三配置如下:
CubeMX工程生产设置如下:
最后点击ProjectàGenerate Code生成工程文件。在生成的工程如下:
在EEDrone的Example中新建一个文件夹”UART_Test”
将生成的工程中Src中的文件复制到新建的文件夹中,注意“system_stm32f7xx.c’不要复制,因为都是一样的,这里inc文件夹是可以不复制进来的,因为主工程包含了,最后文件夹文件如下:
然后使用IAR(推荐使用IAR7.7版本)打开工程,在Example上右击àaddàadd group,填写”UART_Test”如下图:
在新建文件夹上右击addàadd file,将刚刚的文件夹中的内容全部选中,点击打开。
然后在”User”文件夹和Example文件夹中其他文件夹都排除编译,在文件夹上右击案后勾上”Eculude from build”,然后ProjectàRebuild all。每次更换Demo都需要重新编译。
编写代码我推荐使用sourceinside,他能写代码的效率提高不少,当然也可以直接使用IAR,或者其他的软件,这个没有什么问题。sourceinside工程的添加方法就不介绍了,这里介绍个插件与小技巧。SI是不支持标签的,这个有时候会非常不方便,可以使用这个sihook插件下载地址:审核中。。。
直接将插件复制到根目录就好,下面是效果图:
由于工程中有很多例子,这也就会导致很多的main.c文件和其他的相同名字文件,给搜索造成干扰。SI可以很方便的添加和去除包含的工程文件,Projectàadd and remove project files
如下图:
现在开始添加代码,首先添加一个全局变量用来存收到的数据:
uint8_t receive;
复制代码
在uart.c中添加如下两段代码:
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
复制代码
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART3 and Loop until the end of transmission */
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
复制代码
然后添加主函数中断接收代码和一个printf发送:
HAL_UART_Receive_IT(&huart3,(uint8_t *)&receive,1);
printf("hello");
复制代码
在main.c主函数外添加一个中断接收回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Receive_IT(&huart3,(uint8_t *)&receive,1);
HAL_UART_Transmit(&huart3, (uint8_t *)&receive, 1, 0xFFFF);
}
复制代码
好啦,大功告成,现在烧录进去后首先会显示“hello”,然后输入什么就会输出什么。如下图:
源码地址:https://github.com/EEDrone/Firmware/tree/V0.01_uart