From 246f3532ffdad80df03d8997abd49e655b8f173d Mon Sep 17 00:00:00 2001 From: Dhiru Kholia Date: Thu, 2 Mar 2023 12:18:10 +0530 Subject: [PATCH] feat: hal i2c pcf8574 lcd demos --- Examples/HAL/I2C/PCF8574_I2C_LCD/main.c | 149 ++++++++++++ .../I2C/PCF8574_I2C_LCD/py32f0xx_hal_conf.h | 229 ++++++++++++++++++ .../I2C/PCF8574_I2C_LCD/py32f0xx_hal_msp.c | 66 +++++ .../HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.c | 85 +++++++ .../HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.h | 48 ++++ .../I2C/PCF8574_I2C_LCD_F003_SOP16/README.md | 33 +++ .../HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/main.c | 149 ++++++++++++ .../py32f0xx_hal_conf.h | 229 ++++++++++++++++++ .../py32f0xx_hal_msp.c | 64 +++++ .../PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.c | 85 +++++++ .../PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.h | 48 ++++ 11 files changed, 1185 insertions(+) create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD/main.c create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_conf.h create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_msp.c create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.c create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.h create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/README.md create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/main.c create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_conf.h create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_msp.c create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.c create mode 100644 Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.h diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD/main.c b/Examples/HAL/I2C/PCF8574_I2C_LCD/main.c new file mode 100644 index 0000000..5aab192 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD/main.c @@ -0,0 +1,149 @@ +// This example was tested with 'PY32F030F28P6TU TSSOP20' chip + +#include "py32f0xx_hal_dma.h" +#include "py32f0xx_hal_i2c.h" +#include "py32f0xx_bsp_printf.h" + +#define I2C_ADDRESS 0xA0 /* host address */ + +I2C_HandleTypeDef I2cHandle; + +void APP_ErrorHandler(void); +static void APP_I2C_Config(void); + +#define SLAVE_ADDRESS_LCD 0x4E // PCF8574 + +// LCD handling functions are borrowed from https://controllerstech.com/i2c-lcd-in-stm32/ +void lcd_send_cmd (char cmd) +{ + char data_u, data_l; + uint8_t data_t[4]; + data_u = (cmd&0xf0); + data_l = ((cmd<<4)&0xf0); + data_t[0] = data_u|0x0C; // en=1, rs=0 + data_t[1] = data_u|0x08; // en=0, rs=0 + data_t[2] = data_l|0x0C; // en=1, rs=0 + data_t[3] = data_l|0x08; // en=0, rs=0 + HAL_I2C_Master_Transmit (&I2cHandle, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100); +} + +void lcd_send_data (char data) +{ + char data_u, data_l; + uint8_t data_t[4]; + data_u = (data&0xf0); + data_l = ((data<<4)&0xf0); + data_t[0] = data_u|0x0D; // en=1, rs=0 + data_t[1] = data_u|0x09; // en=0, rs=0 + data_t[2] = data_l|0x0D; // en=1, rs=0 + data_t[3] = data_l|0x09; // en=0, rs=0 + HAL_I2C_Master_Transmit (&I2cHandle, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100); +} + +void lcd_clear (void) +{ + lcd_send_cmd (0x80); + for (int i=0; i<70; i++) { + lcd_send_data (' '); + } +} + +void lcd_put_cur(int row, int col) +{ + switch (row) { + case 0: + col |= 0x80; + break; + case 1: + col |= 0xC0; + break; + } + + lcd_send_cmd (col); +} + +void lcd_init (void) +{ + // 4 bit initialisation + HAL_Delay(50); // wait for > 40ms + lcd_send_cmd (0x30); + HAL_Delay(5); // wait for > 4.1ms + lcd_send_cmd (0x30); + HAL_Delay(1); // wait for > 100us + lcd_send_cmd (0x30); + HAL_Delay(10); + lcd_send_cmd (0x20); // 4bit mode + HAL_Delay(10); + + // display initialisation + lcd_send_cmd (0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters) + HAL_Delay(1); + lcd_send_cmd (0x08); // Display on/off control --> D=0, C=0, B=0 ---> display off + HAL_Delay(1); + lcd_send_cmd (0x01); // clear display + HAL_Delay(1); + HAL_Delay(1); + lcd_send_cmd (0x06); // Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift) + HAL_Delay(1); + lcd_send_cmd (0x0C); // Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits) +} + +void lcd_send_string (char *str) +{ + while (*str) lcd_send_data (*str++); +} + +int main(void) +{ + HAL_Init(); + + BSP_USART_Config(); + printf("SystemClk:%ld\r\n", SystemCoreClock); + + APP_I2C_Config(); + + lcd_init (); + + lcd_send_string ("HELLO WORLD!"); + HAL_Delay(1000); + lcd_put_cur(1, 0); + lcd_send_string("HOWDY!"); + HAL_Delay(2000); + + while(1); +} + +static void APP_I2C_Config(void) +{ + I2cHandle.Instance = I2C; + I2cHandle.Init.ClockSpeed = 100000; // 100KHz ~ 400KHz + I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9; + I2cHandle.Init.OwnAddress1 = I2C_ADDRESS; + I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&I2cHandle) != HAL_OK) + { + APP_ErrorHandler(); + } +} + +void APP_I2C_Transmit(uint8_t devAddress, uint8_t memAddress, uint8_t *pData, uint16_t len) +{ + HAL_I2C_Mem_Write(&I2cHandle, devAddress, memAddress, I2C_MEMADD_SIZE_8BIT, pData, len, 5000); +} + +void APP_ErrorHandler(void) +{ + while (1); +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Export assert error source and line number + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + while (1); +} +#endif /* USE_FULL_ASSERT */ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_conf.h b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_conf.h new file mode 100644 index 0000000..2b3ce01 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_conf.h @@ -0,0 +1,229 @@ +/** + ****************************************************************************** + * @file py32f0xx_hal_conf.h + * @author MCU Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __PY32F0xx_HAL_CONF_H +#define __PY32F0xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_SPI_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_LED_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)24000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)200) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Low Speed Internal oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32768) /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ + +/** + * @brief Adjust the value of External Low Speed oscillator (LSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define PRIORITY_HIGHEST 0 +#define PRIORITY_HIGH 1 +#define PRIORITY_LOW 2 +#define PRIORITY_LOWEST 3 +#define TICK_INT_PRIORITY ((uint32_t)PRIORITY_LOWEST) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 0 + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ +#ifdef HAL_MODULE_ENABLED + #include "py32f0xx_hal.h" +#endif /* HAL_MODULE_ENABLED */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "py32f0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "py32f0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "py32f0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "py32f0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "py32f0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "py32f0xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "py32f0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "py32f0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "py32f0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "py32f0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "py32f0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "py32f0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "py32f0xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "py32f0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "py32f0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "py32f0xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "py32f0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "py32f0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "py32f0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __PY32F0xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_msp.c b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_msp.c new file mode 100644 index 0000000..b4df44e --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_hal_msp.c @@ -0,0 +1,66 @@ +/** + ****************************************************************************** + * @file py32f0xx_hal_msp.c + * @author MCU Application Team + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "py32f0xx_hal.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* External functions --------------------------------------------------------*/ + +/** + * @brief Configure the Flash prefetch and the Instruction cache, + * the time base source, NVIC and any required global low level hardware + * by calling the HAL_MspInit() callback function from HAL_Init() + * + */ +void HAL_MspInit(void) +{ +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + __HAL_RCC_I2C_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + + /** + PF1 ------> I2C1_SCL + PF0 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_I2C; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + __HAL_RCC_I2C_FORCE_RESET(); + __HAL_RCC_I2C_RELEASE_RESET(); +} + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.c b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.c new file mode 100644 index 0000000..2a0c9f6 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.c @@ -0,0 +1,85 @@ +/** + ****************************************************************************** + * @file py32f0xx_it.c + * @author MCU Application Team + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "py32f0xx_hal.h" +#include "py32f0xx_it.h" + +/* Private includes ----------------------------------------------------------*/ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private user code ---------------------------------------------------------*/ +/* External variables --------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M0+ Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + while (1) + { + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + HAL_IncTick(); +} + +/******************************************************************************/ +/* PY32F0xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file. */ +/******************************************************************************/ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.h b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.h new file mode 100644 index 0000000..c3ec5de --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD/py32f0xx_it.h @@ -0,0 +1,48 @@ +/** + ****************************************************************************** + * @file py32f0xx_it.h + * @author MCU Application Team + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __PY32F0XX_IT_H +#define __PY32F0XX_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __PY32F0XX_IT_H */ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/README.md b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/README.md new file mode 100644 index 0000000..7e740a6 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/README.md @@ -0,0 +1,33 @@ +Following `Makefile` changes are needed to run this example: + +```diff +diff --git a/Makefile b/Makefile +index 5c24b12..cca49c1 100644 +--- a/Makefile ++++ b/Makefile +@@ -38,13 +38,13 @@ PYOCD_EXE ?= pyocd + # py32f003x4, py32f003x6, py32f003x8, + # py32f030x3, py32f030x4, py32f030x6, py32f030x7, py32f030x8 + # py32f072xb +-PYOCD_DEVICE ?= py32f030x8 ++PYOCD_DEVICE ?= py32f003x6 + + + ##### Paths ############ + + # Link descript file: py32f002x5.ld, py32f003x6.ld, py32f003x8.ld, py32f030x6.ld, py32f030x8.ld +-LDSCRIPT = Libraries/LDScripts/py32f030x8.ld ++LDSCRIPT = Libraries/LDScripts/py32f003x6.ld + # Library build flags: + # PY32F002x5, PY32F002Ax5, + # PY32F003x4, PY32F003x6, PY32F003x8, +@@ -61,7 +61,7 @@ CFILES := + # ASM source folders + ADIRS := User + # ASM single files +-AFILES := Libraries/CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f030.s ++AFILES := Libraries/CMSIS/Device/PY32F0xx/Source/gcc/startup_py32f003.s + + # Include paths + INCLUDES := Libraries/CMSIS/Core/Include \ +``` diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/main.c b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/main.c new file mode 100644 index 0000000..b9de429 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/main.c @@ -0,0 +1,149 @@ +// This example was tested with 'PY32F003W16S6TU SOP16' chip + +#include "py32f0xx_hal_dma.h" +#include "py32f0xx_hal_i2c.h" +#include "py32f0xx_bsp_printf.h" + +#define I2C_ADDRESS 0xA0 /* host address */ + +I2C_HandleTypeDef I2cHandle; + +void APP_ErrorHandler(void); +static void APP_I2C_Config(void); + +#define SLAVE_ADDRESS_LCD 0x4E // PCF8574 + +// LCD handling functions are borrowed from https://controllerstech.com/i2c-lcd-in-stm32/ +void lcd_send_cmd (char cmd) +{ + char data_u, data_l; + uint8_t data_t[4]; + data_u = (cmd&0xf0); + data_l = ((cmd<<4)&0xf0); + data_t[0] = data_u|0x0C; // en=1, rs=0 + data_t[1] = data_u|0x08; // en=0, rs=0 + data_t[2] = data_l|0x0C; // en=1, rs=0 + data_t[3] = data_l|0x08; // en=0, rs=0 + HAL_I2C_Master_Transmit (&I2cHandle, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100); +} + +void lcd_send_data (char data) +{ + char data_u, data_l; + uint8_t data_t[4]; + data_u = (data&0xf0); + data_l = ((data<<4)&0xf0); + data_t[0] = data_u|0x0D; // en=1, rs=0 + data_t[1] = data_u|0x09; // en=0, rs=0 + data_t[2] = data_l|0x0D; // en=1, rs=0 + data_t[3] = data_l|0x09; // en=0, rs=0 + HAL_I2C_Master_Transmit (&I2cHandle, SLAVE_ADDRESS_LCD,(uint8_t *) data_t, 4, 100); +} + +void lcd_clear (void) +{ + lcd_send_cmd (0x80); + for (int i=0; i<70; i++) { + lcd_send_data (' '); + } +} + +void lcd_put_cur(int row, int col) +{ + switch (row) { + case 0: + col |= 0x80; + break; + case 1: + col |= 0xC0; + break; + } + + lcd_send_cmd (col); +} + +void lcd_init (void) +{ + // 4 bit initialisation + HAL_Delay(50); // wait for > 40ms + lcd_send_cmd (0x30); + HAL_Delay(5); // wait for > 4.1ms + lcd_send_cmd (0x30); + HAL_Delay(1); // wait for > 100us + lcd_send_cmd (0x30); + HAL_Delay(10); + lcd_send_cmd (0x20); // 4bit mode + HAL_Delay(10); + + // display initialisation + lcd_send_cmd (0x28); // Function set --> DL=0 (4 bit mode), N = 1 (2 line display) F = 0 (5x8 characters) + HAL_Delay(1); + lcd_send_cmd (0x08); // Display on/off control --> D=0, C=0, B=0 ---> display off + HAL_Delay(1); + lcd_send_cmd (0x01); // clear display + HAL_Delay(1); + HAL_Delay(1); + lcd_send_cmd (0x06); // Entry mode set --> I/D = 1 (increment cursor) & S = 0 (no shift) + HAL_Delay(1); + lcd_send_cmd (0x0C); // Display on/off control --> D = 1, C and B = 0. (Cursor and blink, last two bits) +} + +void lcd_send_string (char *str) +{ + while (*str) lcd_send_data (*str++); +} + +int main(void) +{ + HAL_Init(); + + // BSP_USART_Config(); + // printf("SystemClk:%ld\r\n", SystemCoreClock); + + APP_I2C_Config(); + + lcd_init (); + + lcd_send_string ("HELLO WORLD!"); + HAL_Delay(1000); + lcd_put_cur(1, 0); + lcd_send_string("HOWDY!"); + HAL_Delay(2000); + + while(1); +} + +static void APP_I2C_Config(void) +{ + I2cHandle.Instance = I2C; + I2cHandle.Init.ClockSpeed = 100000; // 100KHz ~ 400KHz + I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9; + I2cHandle.Init.OwnAddress1 = I2C_ADDRESS; + I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&I2cHandle) != HAL_OK) + { + APP_ErrorHandler(); + } +} + +void APP_I2C_Transmit(uint8_t devAddress, uint8_t memAddress, uint8_t *pData, uint16_t len) +{ + HAL_I2C_Mem_Write(&I2cHandle, devAddress, memAddress, I2C_MEMADD_SIZE_8BIT, pData, len, 5000); +} + +void APP_ErrorHandler(void) +{ + while (1); +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Export assert error source and line number + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + while (1); +} +#endif /* USE_FULL_ASSERT */ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_conf.h b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_conf.h new file mode 100644 index 0000000..2b3ce01 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_conf.h @@ -0,0 +1,229 @@ +/** + ****************************************************************************** + * @file py32f0xx_hal_conf.h + * @author MCU Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __PY32F0xx_HAL_CONF_H +#define __PY32F0xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_SPI_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_LED_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)24000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)200) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Low Speed Internal oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32768) /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ + +/** + * @brief Adjust the value of External Low Speed oscillator (LSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define PRIORITY_HIGHEST 0 +#define PRIORITY_HIGH 1 +#define PRIORITY_LOW 2 +#define PRIORITY_LOWEST 3 +#define TICK_INT_PRIORITY ((uint32_t)PRIORITY_LOWEST) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 0 + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ +#ifdef HAL_MODULE_ENABLED + #include "py32f0xx_hal.h" +#endif /* HAL_MODULE_ENABLED */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "py32f0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "py32f0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "py32f0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "py32f0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "py32f0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "py32f0xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "py32f0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "py32f0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "py32f0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "py32f0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "py32f0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "py32f0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "py32f0xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "py32f0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "py32f0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "py32f0xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "py32f0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "py32f0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "py32f0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __PY32F0xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_msp.c b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_msp.c new file mode 100644 index 0000000..e198751 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_hal_msp.c @@ -0,0 +1,64 @@ +/** + ****************************************************************************** + * @file py32f0xx_hal_msp.c + * @author MCU Application Team + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "py32f0xx_hal.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* External functions --------------------------------------------------------*/ + +/** + * @brief Configure the Flash prefetch and the Instruction cache, + * the time base source, NVIC and any required global low level hardware + * by calling the HAL_MspInit() callback function from HAL_Init() + * + */ +void HAL_MspInit(void) +{ +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + __HAL_RCC_I2C_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + // PF1 ------> I2C1_SCL + // PF0 ------> I2C1_SDA + GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_I2C; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + __HAL_RCC_I2C_FORCE_RESET(); + __HAL_RCC_I2C_RELEASE_RESET(); +} + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.c b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.c new file mode 100644 index 0000000..2a0c9f6 --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.c @@ -0,0 +1,85 @@ +/** + ****************************************************************************** + * @file py32f0xx_it.c + * @author MCU Application Team + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "py32f0xx_hal.h" +#include "py32f0xx_it.h" + +/* Private includes ----------------------------------------------------------*/ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private user code ---------------------------------------------------------*/ +/* External variables --------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M0+ Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + while (1) + { + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + HAL_IncTick(); +} + +/******************************************************************************/ +/* PY32F0xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file. */ +/******************************************************************************/ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/ diff --git a/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.h b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.h new file mode 100644 index 0000000..c3ec5de --- /dev/null +++ b/Examples/HAL/I2C/PCF8574_I2C_LCD_F003_SOP16/py32f0xx_it.h @@ -0,0 +1,48 @@ +/** + ****************************************************************************** + * @file py32f0xx_it.h + * @author MCU Application Team + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) Puya Semiconductor Co. + * All rights reserved.

+ * + *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __PY32F0XX_IT_H +#define __PY32F0XX_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __PY32F0XX_IT_H */ + +/************************ (C) COPYRIGHT Puya *****END OF FILE******************/