这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 初识STM32G0

共4条 1/1 1 跳转至

初识STM32G0

菜鸟
2020-12-27 17:25:59     打赏
G0的介绍

G0是ST新推出的系列,我手上的是ST官方送出的STM32G070RB-NUCLEO板,在峰会上有幸获得。拿到这个板子的第一反应是觉得,它跟STM32F103RB长得好像啊,但一看原理图才发现,G0满满的IO口,IO的占用率高了好多.。

在这里插入图片描述

安装好STM32CubeMX之后,打开一看,IO的复用也很多,片上外设很丰富,对于普通的控制使用,完全没问题。内置有64K的ROM和128K的flash,对于跑一些UCOSIII 或者RT_Thread等RTOS毫无压力,当然了,emwin这种GUI就算了。官板上,板载STlink,可以很方便的下载,且带有串口,连接的是G0的USART2,使用A2,A3复用。板载一个用户LED和一个用户按键,还有一个复位按键。
任何板子都从点灯开始

开始建立项目并点亮第一个灯

通过配置STM32CubeMX,配置好时钟等外设之后,从原理图上,可以找到LD4接的是A5这个引脚。通过在STM32CubeMX上将该引脚配置为推挽输出模式,点解生成代码即可。STM32CubeMX使用的是HAL库,所以要让LD4交替闪烁,我们使用HAL库上的API

 HAL_GPIO_TogglePin() 
1

使用这个API函数,再使用

HAL_Delay(500),1

则LD4可以以500MS的时间交替闪烁。而这整个过程,只要熟悉了STM32CubeMX,都可以很快建立好工程并实现控制效果。

配置ADC

通过STM32CubeMX,配置A1,A2两个管脚,复用为ADC功能。ADC的配置程序如下:

void adc1_init(void) 
{
    GPIO_InitTypeDef GPIO_Init;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_ADC_CLK_ENABLE();  //开启ADC时钟

GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_Init.Mode = GPIO_MODE_ANALOG;
GPIO_Init.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_Init);

hadc1.Instance = ADC1;          
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频 64/4= 16MHz
hadc1.Init.Resolution = ADC_RESOLUTION_12B;             //12位模式
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;             //右对齐
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;             //ADC扫描模式  非
hadc1.Init.EOCSelection = DISABLE;                      //关闭EOC中断
hadc1.Init.LowPowerAutoWait = DISABLE;                  //低功耗自动等待模式
hadc1.Init.LowPowerAutoPowerOff = DISABLE;              //低功耗自动掉电模式
hadc1.Init.ContinuousConvMode = DISABLE;                 //关闭连续转换
hadc1.Init.NbrOfConversion = 2;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;

if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
      Error_Handler();
    }
}123456789101112131415161718192021222324252627282930313233343536

而ADC的读取函数,另外编写,

uint16_t ADC_GET(uint32_t adc_ch) 
{
    ADC_ChannelConfTypeDef sConfig;
    
    sConfig.Channel = adc_ch;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
 
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1,10);
    
    return HAL_ADC_GetValue(&hadc1);
}123456789101112131415

最后讲程序烧写进去之后,将会发现一件很神奇的事情,
在这里插入图片描述
会出现这样的情况。原因在于ADC初始化两个通道需要比较长的时间,而慢慢地会回归到正常值。在使用STM32F103ZET6的时候并没有出现这种情况。但是在STM32F429IG上也有过这种情况的出现,因此本虫认为G070RB的ADC功能并没有F1系列的好用。

此内容为转载内容如有侵权联系删除。原文链接https://blog.csdn.net/qq_42312125/article/details/96728956?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160906066416780273351656%252522%25252C%252522scm%252522%25253A%25252220140713.130102334..%252522%25257D&request_id=160906066416780273351656&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-8-96728956.nonecase&utm_term=stm32g0




工程师
2020-12-28 22:41:07     打赏
2楼

不错的分享


工程师
2020-12-30 22:13:30     打赏
3楼

是个不错的芯片


工程师
2021-01-12 23:23:07     打赏
4楼

感谢您的分享


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]