进程1:收到STM32L053 Nucleo
进程2:建立MDK编译环境
今天终于收到EEPW寄来的STM32L053 Nucleo板。先晒一下:
还附了任务卡。一定会认真完成任务。
进程2:建立MDK编译环境
MDK4不支持STM32L0系列,只能MDK5支持。
在MDK5的“Packs installer"选项的"Devices"窗口中添加STM32L0系列,然后在”packs"窗口中选择对应的STM32L0的"Action"-Install进行安装。
安装成功后,在项目选项的“Device"就能够找到STM32L053R8这片芯片了。
至此,STM32L053的编程环境已经建立完成。
进程3:驱动LCD
准备给STM32L053 NUCLEO板配置一片LCD。STM32L053的最主要特点是低功耗,如果为其配置TFT或点阵LCD,将使得STM32L053的低功耗特性大打折扣了,体现不出本次活动对这颗芯片性能的期望。于是决定为它配置段码式LCD模块,手头刚好有一片GH08172T液晶模块,正好用上。
一开始认为调试应该不复杂,ST公司的STM32CubeFW_L0_V1.3的库是现成的,里面就有LCD例程,拿来就用应该没问题。硬件连接见下图,用1只IC插座和杜邦线将LCD和开发板连接完成。
GH08172T真值表:
实际的调试工作并不顺利,费力不少时间,走了不少弯路,STM32Cube_FW_L0__V1.3库里例程好像是从STM32L1XX系列移植过来的,STM32L0XX系列LCD引脚与STM32L1XX系列定义相差不少,GPIO引脚如果直接套用过来根本不能正常工作。修改后见下表:
在STM32L1XX基础上修改的引脚:
GPIO初始化的修改: void HAL_LCD_MspInit(LCD_HandleTypeDef *hlcd) { GPIO_InitTypeDef GPIO_InitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); __HAL_RCC_BACKUPRESET_FORCE(); __HAL_RCC_BACKUPRESET_RELEASE(); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {while(1); } __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |GPIO_PIN_6|GPIO_PIN_7| GPIO_PIN_8 | GPIO_PIN_9 |GPIO_PIN_10 |GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ; GPIO_InitStruct.Alternate = GPIO_AF1_LCD; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 |GPIO_PIN_8 | GPIO_PIN_9 \ | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |GPIO_PIN_4| GPIO_PIN_5; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); __HAL_RCC_LCD_CLK_ENABLE(); } LCD初始化 void BSP_LCD_GLASS_Init(void) { LCDHandle.Instance = LCD; LCDHandle.Init.Prescaler = LCD_PRESCALER_2; LCDHandle.Init.Divider = LCD_DIVIDER_16; LCDHandle.Init.Duty = LCD_DUTY_1_4; LCDHandle.Init.Bias = LCD_BIAS_1_3; LCDHandle.Init.VoltageSource = LCD_VOLTAGESOURCE_EXTERNAL;//LCD_VOLTAGESOURCE_INTERNAL; LCDHandle.Init.Contrast = LCD_CONTRASTLEVEL_7; LCDHandle.Init.DeadTime = LCD_DEADTIME_2; LCDHandle.Init.PulseOnDuration = LCD_PULSEONDURATION_7; LCDHandle.Init.HighDrive = DISABLE; LCDHandle.Init.BlinkMode = LCD_BLINKMODE_OFF; LCDHandle.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV8; HAL_LCD_Init(&LCDHandle); } 演示部分代码: uint8_t LCD_String[46]= " STM32L053R8 DISCOVERY DRIVE GH08172 LCD DEMO "; int main(void) { HAL_Init(); SystemClock_Config(); BSP_LCD_GLASS_Init(); BSP_LCD_GLASS_ScrollSentence(LCD_String, SCROLL_NUM, SCROLL_SPEED_L); while (1) { } } 系统时钟: static void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; RCC_OscInitStruct.MSICalibrationValue=0x00; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); }
另外开发板上的SB13-SB14还要断开,SB62-SB63要短接,否则LCD的第1和第2位数码显示会缺笔画。
视频地址:http://player.youku.com/player.php/sid/XMTQwNTYxOTQ3Mg==/v.swf
STM32L053R8_NUCLEO.rar 点击下载HEX文件
进程4:数字时钟
使用STM32L0低功耗系列的RTC来制作数字时钟再合适不过了,而且代码也很简单,将官方的STM32Cuble_FW_L0_V1.30\STM32L053R8-Nucleo\Example\RTC\RTC_TimeStamp演示稍加修改,结合进程3的LCD代码,就能轻松实现。
主要代码:
uint8_t Time_str[6]={0};
int main(void)
{ HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
BSP_LCD_GLASS_Init();
RtcHandle.Instance = RTC;
RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if(HAL_RTC_Init(&RtcHandle) != HAL_OK)
{ Error_Handler(); }
RTC_TimeStampConfig();
while (1)
{ RTC_CalendarShow(); }
}
//系统时钟
static void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
RCC_OscInitStruct.MSICalibrationValue = 0x00;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{ Error_Handler(); }
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{ Error_Handler(); }
}
//RTC配置
static void RTC_TimeStampConfig(void)
{ RTC_DateTypeDef sdatestructure;
RTC_TimeTypeDef stimestructure;
RTC_TamperTypeDef stamperstructure;
stamperstructure.Filter = RTC_TAMPERFILTER_DISABLE;
stamperstructure.Tamper = RTC_TAMPER_1;
stamperstructure.Trigger = RTC_TAMPERTRIGGER_FALLINGEDGE;
stamperstructure.SamplingFrequency = RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV4096;
stamperstructure.PrechargeDuration = RTC_TAMPERPRECHARGEDURATION_1RTCCLK ;
stamperstructure.TamperPullUp = RTC_TAMPER_PULLUP_DISABLE;
stamperstructure.TimeStampOnTamperDetection = RTC_TIMESTAMPONTAMPERDETECTION_ENABLE;
HAL_RTCEx_SetTamper(&RtcHandle, &stamperstructure);
HAL_RTCEx_SetTimeStamp_IT(&RtcHandle, RTC_TIMESTAMPEDGE_RISING, RTC_TIMESTAMPPIN_DEFAULT);
sdatestructure.Year = 0x14;
sdatestructure.Month = RTC_MONTH_APRIL;
sdatestructure.Date = 0x14;
sdatestructure.WeekDay = RTC_WEEKDAY_MONDAY;
if(HAL_RTC_SetDate(&RtcHandle,&sdatestructure,RTC_FORMAT_BCD) != HAL_OK)
{ Error_Handler(); }
stimestructure.Hours = 0x23;
stimestructure.Minutes = 0x58;
stimestructure.Seconds = 0x00;
stimestructure.TimeFormat = RTC_HOURFORMAT12_AM;
stimestructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
stimestructure.StoreOperation = RTC_STOREOPERATION_RESET;
if(HAL_RTC_SetTime(&RtcHandle,&stimestructure,RTC_FORMAT_BCD ) != HAL_OK)
{ Error_Handler(); }
}
//时钟显示
void RTC_CalendarShow(void)
{ RTC_DateTypeDef sdatestructureget;
RTC_TimeTypeDef stimestructureget;
HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN);
Time_str[0]=aShowTime[0];
Time_str[1]=aShowTime[1];
Time_str[2]=aShowTime[3];
Time_str[3]=aShowTime[4];
Time_str[4]=aShowTime[6];
Time_str[5]=aShowTime[7];
BSP_LCD_GLASS_DisplayString((uint8_t*)(Time_str));
}
void MX_GPIO_Init(void)
{
__GPIOC_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
}
//LCD初始化
void BSP_LCD_GLASS_Init(void)
{ LCDHandle.Instance = LCD;
LCDHandle.Init.Prescaler = LCD_PRESCALER_2;
LCDHandle.Init.Divider = LCD_DIVIDER_24;
LCDHandle.Init.Duty = LCD_DUTY_1_4;
LCDHandle.Init.Bias = LCD_BIAS_1_3;
LCDHandle.Init.VoltageSource = LCD_VOLTAGESOURCE_EXTERNAL;
LCDHandle.Init.Contrast = LCD_CONTRASTLEVEL_7;
LCDHandle.Init.DeadTime = LCD_DEADTIME_2;
LCDHandle.Init.PulseOnDuration = LCD_PULSEONDURATION_7;
LCDHandle.Init.HighDrive = DISABLE;
LCDHandle.Init.BlinkMode = LCD_BLINKMODE_OFF;
LCDHandle.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV8;
HAL_LCD_Init(&LCDHandle);
}
视频地址:http://player.youku.com/player.php/sid/XMTQwOTIyNzgzMg==/v.swf
进程5:使用STM32CubeMX配置ADC
1、在STM32CubeMX中选择芯片型号STM32L053R8Tx,在Pinout里选择ADC_IN0打勾:
2、RCC的 系统时钟选项的Low Speed Clock(LSE)打勾:
3、SYS的Serial WIRE dEBUG(SWD)打勾,使能仿真调试:
4、在Configuration对ADC进行配置:
//ADC的配置
void MX_ADC_Init(void) { ADC_ChannelConfTypeDef sConfig; /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc.Instance = ADC1; hadc.Init.OversamplingMode = DISABLE; hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV1; hadc.Init.Resolution = ADC_RESOLUTION12b; hadc.Init.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; hadc.Init.ScanDirection = ADC_SCAN_DIRECTION_BACKWARD; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = EOC_SINGLE_CONV; hadc.Init.Overrun = OVR_DATA_PRESERVED; hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.LowPowerFrequencyMode = ENABLE; hadc.Init.LowPowerAutoOff = DISABLE; HAL_ADC_Init(&hadc); /**Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_0; HAL_ADC_ConfigChannel(&hadc, &sConfig); }
在主函数中添加ADC的启动和采样:
int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); BSP_LCD_GLASS_Init(); MX_ADC_Init(); MX_LCD_Init(); HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED); HAL_ADC_Start(&hadc); BSP_LCD_GLASS_DisplayString((uint8_t*)(DispBuf)); while (1) { HAL_ADC_PollForConversion(&hadc, 10); if ((HAL_ADC_GetState(&hadc) & HAL_ADC_STATE_EOC) == HAL_ADC_STATE_EOC) { uwADCxConvertedValue += HAL_ADC_GetValue(&hadc); Count++; if(Count==64) {uwADCxConvertedValue>>=6; To_buf(); BSP_LCD_GLASS_DisplayString((uint8_t*)(DispBuf)); Count=0; uwADCxConvertedValue=0; } } } } static void To_buf(void) {uint16_t TMP; TMP=uwADCxConvertedValue*8/10; DispBuf[0]=' '; DispBuf[1]=' '; DispBuf[2]=TMP/1000+0x30; DispBuf[3]=TMP%1000/100+0x30; DispBuf[4]=TMP%100/10+0x30; DispBuf[5]=TMP%10+0x30; }
外接1只电位器在+3.3V与DNG间,抽头连接ADC_IN0输入端:
视频地址:http://player.youku.com/player.php/sid/XMTQxODk2MzQxNg==/v.swf
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |