【ST NUCLEO-G071RB评测】+ 我的评测过程
本帖最后由 hujj 于 2019-1-9 10:45 编辑本评测使用的ST NUCLEO-G071RB开发板来自EEWORL论坛,以下是STM产品的链接:
https://www.stmcu.com.cn/index.p ... /261/layout/product
这几天一直都在忙于查看资料,在之前整理了芯片引脚排列资料的基础上,还将芯片用户手册的目录和部分内容通过百度翻译整理成了中文,以弥补本人英文水平低的缺陷,以后使用起来就方便多了。
这是整理后的数据手册目录:
另外查找到了开发板扩展引脚排列图,并转换成PDF文件:
开发项目的模板也建立好了,平台采用Keil MDK,将下载的模板复制到工程目录,通过了编译。
下一步就准备先将LCD5110驱动起来,以便作其它测试,测试过程会在后续贴中陆续分享给大家。
经过阅读坛友lising的帖子https://bbs.eeworld.com.cn/thread-1066453-1-1.html,发现我移植的工程模板虽然编译能通过,但似乎还存在问题:一是MCU的选择我仅能选到"ARMCM0",不能选择到具体的型号(参见下图),另外对应的晶振频率是12.0M,不是开发板上实际的8M。为此,我在STM32社区另一个坛友的帖子里下载了“STM32G0xx_DFP.1.0.0.pcack"升级包,运行之后再重新移植项目,发现这些设置完全正确了。
下图是升级之后重建项目的相关设置:
之后才发现只要点击窗口内pack下面的链接,就可以直接在keil的官网上查找和下载相关的升级包。
重新建立的项目晶振设置已经是正常的8MHz(见下图)。
重新移植项目之后,照例又要重新设置相关文件的路径和包含搜索路径,参见下图:
我不明白的是为什么原来设置的路径用的是正斜杠,我开始也照此修改,但无效,后来点击末尾的搜索按钮生成的路径全是反斜杠。
修改了包含文件的搜索路径之后,还要修改固件库文件的路径,如下图所示:
文件路径修改相对简单,只要点击右键,选择弹出菜单的第一行,然后设置成新项目文件的路径就行。
修改之后再试编译,这次应该是真正完成了开发平台的建立。
在坛友lising的指点下,我下载并安装了STM32CubeMX软件,下面是软件的主要界面:
这是引脚和配置界面,双击左边列表中的选项,选中需要使用的功能,右边的MCU引脚图会对应显示相应要使用的引脚。
也可以选择用框图方式显示:
这是系统时钟配置界面:
这是项目相关参数的设置界面,可以按照自己的需要进行定制。
最后一个是工具界面。
进入这个软件时可以先建立项目,指定项目保存的位置,选择好MCU的型号规格以及开发平台。设置好所需的功能之后点击右上部的GENERATE CODE就可以自动生成项目文件,然后再用相应的开发平台打开,不需要再进行基本的配置就可以在这个基础上写代码了。
使用这个软件可以保证相应功能的设置不会遗漏或错误,对象我一样的初学者来说有帮助。目前对这个软件的操作还不熟悉,还在学习摸索过程中。
这几天都在熟悉STM32CubeMX软件,通过软件建立的模板,参考坛友lising的相关帖子,试验了通过按键控制LED灯闪烁的频率,按键检测采用中断方式,在主程序中定义一个变量,每次检测到按键时变量自加125毫秒,超过1000毫秒时又从125毫秒开始。在主程序while()循环里先对LED灯翻转,然后按照这个变量值进行延时。下面是主程序:
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_Init();
MX_I2C2_Init();
MX_SPI1_Init();
systick_init();
led_flag = 0;
LCD_init();
LCD_clear();
scree_start();
while (1)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); //LD4端口翻转
delay_ms(led_time);
}
}
这是按键的处理函数,每次按键中断变量 自增125毫秒。
/****************************************************************
* 中断回调函数,
* 接收中断处理函数调用EXTI4_15_IRQHandler()传递的中断引脚号 *
****************************************************************/
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == KEY0_Pin) //确认PC13产生下降沿脉冲
{
led_time = led_time + 125;
if(led_time > 1000) led_time = 125;
}
}
下面是GPIO引脚定义和按键中断配置的函数:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//用户按键引脚初始化(中断方式)
GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = KEY0_Pin;
HAL_GPIO_Init(KEY0_GPIO_Port, &GPIO_InitStructure);
//用户按键接PC13端口,即外部中断“EXTI Line 4 to 15 Interrupts”;
//设置中断优先级(0~3),此处设置为最高“0”;M0+内核不支持中断子优先级,此处设置为“0”;
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
//使能PC13引脚中断
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
//用户LED引脚初始化
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Pin = LED0_Pin;
HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStructure);
// GPIOA->MODER &= ~(0X3<<10); //清0
// GPIOA->MODER |= (1<<10); //=01 设置PA5输出模式
//LCD5110引脚初始化
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Pin = LCD_RST | LCD_CE | LCD_DC | LCD_DIN | LCD_CLK;
HAL_GPIO_Init(LCD_GPIO_Port, &GPIO_InitStructure);
}
近两天都在移植LCD5110程序,在STM32F103下面正常运行的程序,移植到STM32G071下面就出错,编译正常通过,可是运行时就出错,通过程序调试找到出错是在写字符串时指针下标引起的,显示单个字符则没有问题,目前尚未找到解决办法,暂时只好通过字符编号来显示,程序的可读性就差了许多。 经过几天时间调试,LCD5110显示屏终于点亮了。下一步准备测试flash保存用户数据。 <div class='shownolgin' data-isdigest='no'>这两天在尝试flash的读写操作,将示例程序复制并调试通过。经过了解,flash操作的步骤第一步是将要操作的页面先刷擦除(即全部写成"1"),之后的写入过程只能将其中的"1"改变为"0",也就是说单个地址的值不能随意改变,若要改变,只能将整页擦除再重写。</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <div class='shownolgin' data-isdigest='no'> 这几天参照范例测试了flash的擦除、写和读的操作,代码如下:
1、flash擦除的代码
void flash_erase(void)
{
HAL_FLASH_Unlock();
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Page = GetPage(FLASH_USER_START_ADDR);
EraseInitStruct.NbPages = 1;
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
HAL_FLASH_Lock();
}
2、flash写入的代码
void flash_write(uint64_t data64)
{
HAL_FLASH_Unlock();
// HAL_FLASH_Program(FLASH_USER_START_ADDR, FLASH_USER_END_ADDR, data64);
HAL_FLASH_Program(FLASH_USER_START_ADDR, 0x08010000, data64);
HAL_FLASH_Lock();
}
3、flash读代码
uint64_t flash_read(uint64_t ReadAddr)
{
uint64_t ReadData;
ReadData = (*(__IO uint64_t*) ReadAddr);
return ReadData;
}
这些代码编译能通过,今天调试了一天,就是读代码测试通过,擦除和写入的代码都没有测试通过,写入的代码在下图所示的位置出错:
我反复对照范例进行调试都没有解决问题。
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>这几天在调试I2C读写24C02,感觉用系统的I2C来读写非常麻烦,还不如自己写代码更方便灵活。</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>怎么下载程序的</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>直接用keil的下载功能,板上本身带有调试下载器的。</div><script>showreplylogin();</script>
页:
[1]