From 7cdb0cf9ed161c3fc6802028a9e34c9f94b56244 Mon Sep 17 00:00:00 2001 From: dreamcmi <1912544842@qq.com> Date: Sat, 26 Mar 2022 20:46:22 +0800 Subject: [PATCH] add ch582 support package --- package/CH582/CH582.py | 93 ++++++++++++++++++++ package/CH582/ch582_adc.c | 109 +++++++++++++++++++++++ package/CH582/ch582_gpio.c | 92 ++++++++++++++++++++ package/CH582/ch582_iic.c | 78 +++++++++++++++++ package/CH582/ch582_time.c | 34 ++++++++ package/CH582/ch582_uart.c | 166 ++++++++++++++++++++++++++++++++++++ package/CH582/ch582_utils.c | 54 ++++++++++++ package/CH582/ch582_utils.h | 9 ++ package/CH582/pika_config.c | 26 ++++++ 9 files changed, 661 insertions(+) create mode 100644 package/CH582/CH582.py create mode 100644 package/CH582/ch582_adc.c create mode 100644 package/CH582/ch582_gpio.c create mode 100644 package/CH582/ch582_iic.c create mode 100644 package/CH582/ch582_time.c create mode 100644 package/CH582/ch582_uart.c create mode 100644 package/CH582/ch582_utils.c create mode 100644 package/CH582/ch582_utils.h create mode 100644 package/CH582/pika_config.c diff --git a/package/CH582/CH582.py b/package/CH582/CH582.py new file mode 100644 index 000000000..4a0e94c9d --- /dev/null +++ b/package/CH582/CH582.py @@ -0,0 +1,93 @@ +from PikaObj import * +import PikaStdDevice +import PikaStdTask + + +class GPIO(PikaStdDevice.GPIO): + # override + def platformHigh(): + pass + + # override + def platformLow(): + pass + + # override + def platformEnable(): + pass + + # override + def platformDisable(): + pass + + # override + def platformSetMode(): + pass + + # override + def platformRead(): + pass + + +class Time(PikaStdDevice.Time): + # override + def sleep_s(s: int): + pass + + # override + def sleep_ms(ms: int): + pass + + +class ADC(PikaStdDevice.ADC): + # override + def platformEnable(): + pass + + # override + def platformRead(): + pass + + # override + def platformDisable(): + pass + + +class UART(PikaStdDevice.UART): + # override + def platformEnable(): + pass + + # override + def platformWrite(): + pass + + # override + def platformRead(): + pass + + # override + def platformDisable(): + pass + + +class IIC(PikaStdDevice.IIC): + SCL = GPIO() + SDA = GPIO() + # override + + def platformEnable(): + pass + + # override + def platformDisable(): + pass + + # override + def platformWrite(): + pass + + # override + def platformRead(): + pass + diff --git a/package/CH582/ch582_adc.c b/package/CH582/ch582_adc.c new file mode 100644 index 000000000..7b92db747 --- /dev/null +++ b/package/CH582/ch582_adc.c @@ -0,0 +1,109 @@ +#include "CH58x_common.h" +#include "CH582_ADC.h" +#include "ch582_utils.h" + + +signed short RoughCalib_Value = 0; // ADC粗调偏差值 + +uint32_t adc_get_channle(char *pin) +{ + uint32_t p = gpio_get_pin(pin); + switch (p) + { + case GPIO_Pin_0: + return 9; + break; + case GPIO_Pin_1: + return 8; + break; + case GPIO_Pin_2: + return 7; + break; + case GPIO_Pin_3: + return 6; + break; + case GPIO_Pin_4: + return 0; + break; + case GPIO_Pin_5: + return 1; + break; + case GPIO_Pin_6: + return 10; + break; + case GPIO_Pin_7: + return 11; + break; + case GPIO_Pin_8: + return 12; + break; + case GPIO_Pin_9: + return 13; + break; + case GPIO_Pin_12: + return 2; + break; + case GPIO_Pin_13: + return 3; + break; + case GPIO_Pin_14: + return 4; + break; + case GPIO_Pin_15: + return 5; + break; + default: + return -1; + break; + } +} + +void CH582_ADC_platformDisable(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + + ADC_ChannelCfg(0b00001111); // 复位channel + if (adc_get_channle(pin) < 0) // 判断一下pin是不是合理 + { + obj_setErrorCode(self, 1); + obj_setSysOut(self, "[error] not match adc pin."); + } + else + { + GPIOA_ModeCfg(gpio_get_pin(pin), GPIO_ModeIN_PU); + } +} + +void CH582_ADC_platformEnable(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + + if (adc_get_channle(pin) < 0) // 判断一下pin是不是合理 + { + obj_setErrorCode(self, 1); + obj_setSysOut(self, "[error] not match adc pin."); + } + else + { + ADC_ExtSingleChSampInit(SampleFreq_8, ADC_PGA_0); + GPIOA_ModeCfg(gpio_get_pin(pin), GPIO_ModeIN_Floating); + RoughCalib_Value = ADC_DataCalib_Rough(); // 校准数据 + } +} + +void CH582_ADC_platformRead(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + + uint32_t ch = adc_get_channle(pin); + if (ch > 0) + { + ADC_ChannelCfg(ch); + obj_setFloat(self, "val", (ADC_ExcutSingleConver() + RoughCalib_Value)); + } + else + { + obj_setErrorCode(self, 1); + obj_setSysOut(self, "[error] not match adc pin."); + } +} diff --git a/package/CH582/ch582_gpio.c b/package/CH582/ch582_gpio.c new file mode 100644 index 000000000..65ded805f --- /dev/null +++ b/package/CH582/ch582_gpio.c @@ -0,0 +1,92 @@ +#include "CH58x_common.h" +#include "CH582_GPIO.h" +#include "ch582_utils.h" + + +void CH582_GPIO_platformDisable(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + + if (gpio_get_group(pin) == 0) + { + GPIOA_ModeCfg(gpio_get_pin(pin), GPIO_ModeIN_PU); + } + else + { + GPIOB_ModeCfg(gpio_get_pin(pin), GPIO_ModeIN_PU); + } +} + +void CH582_GPIO_platformEnable(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + char *mode = obj_getStr(self, "mode"); + char *pull = obj_getStr(self, "pull"); + GPIOModeTypeDef pmode = gpio_get_mode(mode, pull); + + if (gpio_get_group(pin) == 0) + { + GPIOA_ModeCfg(gpio_get_pin(pin), pmode); + } + else + { + GPIOB_ModeCfg(gpio_get_pin(pin), pmode); + } +} + +void CH582_GPIO_platformHigh(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + + if (gpio_get_group(pin) == 0) + { + GPIOA_SetBits(gpio_get_pin(pin)); + } + else + { + GPIOB_SetBits(gpio_get_pin(pin)); + } +} + +void CH582_GPIO_platformLow(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + + if (gpio_get_group(pin) == 0) + { + GPIOA_ResetBits(gpio_get_pin(pin)); + } + else + { + GPIOB_ResetBits(gpio_get_pin(pin)); + } +} + +void CH582_GPIO_platformRead(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + if (gpio_get_group(pin) == 0) + { + obj_setInt(self, "readBuff", GPIOA_ReadPortPin(gpio_get_pin(pin))); + } + else + { + obj_setInt(self, "readBuff", GPIOB_ReadPortPin(gpio_get_pin(pin))); + } +} + +void CH582_GPIO_platformSetMode(PikaObj *self) +{ + char *pin = obj_getStr(self, "pin"); + char *mode = obj_getStr(self, "mode"); + GPIOModeTypeDef pmode = gpio_get_mode(mode, NULL); + + if (gpio_get_group(pin) == 0) + { + GPIOA_ModeCfg(gpio_get_pin(pin), pmode); + } + else + { + GPIOB_ModeCfg(gpio_get_pin(pin), pmode); + } +} \ No newline at end of file diff --git a/package/CH582/ch582_iic.c b/package/CH582/ch582_iic.c new file mode 100644 index 000000000..cef7865fb --- /dev/null +++ b/package/CH582/ch582_iic.c @@ -0,0 +1,78 @@ +#include "CH58x_common.h" +#include "CH582_IIC.h" + + +void CH582_IIC_platformDisable(PikaObj *self) +{ + I2C_Cmd(DISABLE); +} + +void CH582_IIC_platformEnable(PikaObj *self) +{ + uint8_t deviceAddr = obj_getInt(self, "deviceAddr"); + GPIOB_ModeCfg(GPIO_Pin_13 | GPIO_Pin_12, GPIO_ModeIN_PU); + I2C_Init(I2C_Mode_I2C, 100000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, deviceAddr); + I2C_Cmd(ENABLE); +} + +void CH582_IIC_platformRead(PikaObj *self) +{ + uint8_t length = obj_getInt(self, "length"); + uint8_t readAddr = obj_getInt(self, "readAddr"); + uint8_t i = 0; + uint8_t *data = {0}; + + I2C_AcknowledgeConfig(ENABLE); + I2C_GenerateSTART(ENABLE); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)) + ; + I2C_Send7bitAddress(readAddr, I2C_Direction_Receiver); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) + ; + while (i < length) + { + if (I2C_GetFlagStatus(I2C_FLAG_RXNE) != RESET) + { + if (i == (length - 2)) + { + I2C_AcknowledgeConfig(DISABLE); + data[i] = I2C_ReceiveData(); //读数据,发送nACK + } + else + { + data[i] = I2C_ReceiveData(); //读数据,发送ACK + } + i++; + } + } + I2C_GenerateSTOP(ENABLE); + obj_setStr(self, "readData", (char *)data); +} + +void CH582_IIC_platformWrite(PikaObj *self) +{ + char *writeData = obj_getStr(self, "writeData"); + uint8_t writeAddr = obj_getInt(self, "writeAddr"); + uint8_t i = 0; + uint8_t length = strGetSize(writeData); + + while (I2C_GetFlagStatus(I2C_FLAG_BUSY) != RESET) + ; + I2C_GenerateSTART(ENABLE); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)) + ; + I2C_Send7bitAddress(writeAddr, I2C_Direction_Transmitter); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + ; + while (i < length) + { + if (I2C_GetFlagStatus(I2C_FLAG_TXE) != RESET) + { + I2C_SendData((uint8_t)writeData[i]); + i++; + } + } + while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) + ; + I2C_GenerateSTOP(ENABLE); +} \ No newline at end of file diff --git a/package/CH582/ch582_time.c b/package/CH582/ch582_time.c new file mode 100644 index 000000000..defddc510 --- /dev/null +++ b/package/CH582/ch582_time.c @@ -0,0 +1,34 @@ +#include "CH58x_common.h" +#include "CH582_Time.h" + + +void mdelay1ms() +{ + R32_TMR0_CNT_END = (FREQ_SYS / 1000); + R8_TMR0_CTRL_MOD = RB_TMR_ALL_CLEAR; + R8_TMR0_CTRL_MOD = RB_TMR_COUNT_EN; + while ((R8_TMR0_INT_FLAG & TMR0_3_IT_CYC_END) == 0) + ; + R8_TMR0_INT_FLAG = TMR0_3_IT_CYC_END; +} + +void mdelaym(uint32_t ms) +{ + for (uint32_t i = 0; i < ms; i++) + { + mdelay1ms(); + } +} + +void CH582_Time_sleep_ms(PikaObj *self, int ms) +{ + mdelaym(ms); +} + +void CH582_Time_sleep_s(PikaObj *self, int s) +{ + for (uint32_t i = 0; i < s; i++) + { + mdelaym(1000); + } +} diff --git a/package/CH582/ch582_uart.c b/package/CH582/ch582_uart.c new file mode 100644 index 000000000..563c94440 --- /dev/null +++ b/package/CH582/ch582_uart.c @@ -0,0 +1,166 @@ +#include "CH58x_common.h" +#include "CH582_UART.h" +#include "ch582_utils.h" + + +void UART0_DeInit(void) +{ + R8_UART0_FCR = 0x0; + R8_UART0_LCR = 0x0; + R8_UART0_IER = 0x0; +} + +void UART1_DeInit(void) +{ + R8_UART1_FCR = 0x0; + R8_UART1_LCR = 0x0; + R8_UART1_IER = 0x0; +} + +void UART2_DeInit(void) +{ + R8_UART2_FCR = 0x0; + R8_UART2_LCR = 0x0; + R8_UART2_IER = 0x0; +} + +void UART3_DeInit(void) +{ + R8_UART3_FCR = 0x0; + R8_UART3_LCR = 0x0; + R8_UART3_IER = 0x0; +} + +void CH582_UART_platformEnable(PikaObj *self) +{ + int id = obj_getInt(self, "id"); + int baudrate = obj_getInt(self, "baudRate"); + switch (id) + { + case 0: // TX0:PB7 RX0:PB4 + GPIOB_SetBits(GPIO_Pin_7); + GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); + GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); + UART0_DefInit(); + UART0_BaudRateCfg(baudrate); + break; + case 1: // TX1:PA9 RX1:pa8 + GPIOA_SetBits(GPIO_Pin_9); + GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); + GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); + UART1_DefInit(); + UART1_BaudRateCfg(baudrate); + break; + case 2: // TX2:PA7 RX2:PA6 + GPIOA_SetBits(GPIO_Pin_7); + GPIOA_ModeCfg(GPIO_Pin_6, GPIO_ModeIN_PU); + GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); + UART2_DefInit(); + UART2_BaudRateCfg(baudrate); + break; + case 3: // TX3:PA5 RX3:PA4 + GPIOA_SetBits(GPIO_Pin_5); + GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); + GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeOut_PP_5mA); + UART3_DefInit(); + UART3_BaudRateCfg(baudrate); + default: + break; + } +} + +void CH582_UART_platformRead(PikaObj *self) +{ + int id = obj_getInt(self, "id"); + int len = obj_getInt(self, "length"); + char *readData = NULL; + + switch (id) + { + case 0: + while (len > 0) + { + *readData++ = R8_UART0_RBR; + len--; + } + break; + case 1: + while (len > 0) + { + *readData++ = R8_UART1_RBR; + len--; + } + break; + case 2: + while (len > 0) + { + *readData++ = R8_UART2_RBR; + len--; + } + break; + case 3: + while (len > 0) + { + *readData++ = R8_UART3_RBR; + len--; + } + break; + default: + break; + } + + obj_setStr(self, "readData", readData); +} + +void CH582_UART_platformWrite(PikaObj *self) +{ + int id = obj_getInt(self, "id"); + char *data = obj_getStr(self, "data"); + switch (id) + { + case 0: + UART0_SendString(data, strGetSize(data)); + break; + case 1: + UART1_SendString(data, strGetSize(data)); + break; + case 2: + UART2_SendString(data, strGetSize(data)); + break; + case 3: + UART3_SendString(data, strGetSize(data)); + break; + default: + break; + } +} + +void CH582_UART_platformDisable(PikaObj *self) +{ + int id = obj_getInt(self, "id"); + switch (id) + { + case 0: + UART0_DeInit(); + GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); + GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeIN_PU); + break; + case 1: + UART1_DeInit(); + GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); + GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PU); + break; + case 2: + UART2_DeInit(); + GPIOA_ModeCfg(GPIO_Pin_6, GPIO_ModeIN_PU); + GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeIN_PU); + break; + case 3: + UART3_DeInit(); + GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); + GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU); + break; + default: + break; + } +} \ No newline at end of file diff --git a/package/CH582/ch582_utils.c b/package/CH582/ch582_utils.c new file mode 100644 index 000000000..6773f2be1 --- /dev/null +++ b/package/CH582/ch582_utils.c @@ -0,0 +1,54 @@ +#include "CH58x_common.h" +#include "ch582_utils.h" +#include "string.h" +#include "stdint.h" + +uint8_t gpio_get_group(char *pin) +{ + return strncmp(pin, "PA", 2) == 0 ? 0 : 1; +} + +uint32_t gpio_get_pin(char *pin) +{ + uint32_t num = 0; + if (strlen(pin) == 3) + { + num = pin[2] - 48; + } + else if (strlen(pin) > 3 && strlen(pin) < 5) + { + num = 10 * (pin[2] - 48) + (pin[3] - 48); + } + else + { + return 0; + } + return (uint32_t)1ull << num; +} + +uint32_t gpio_get_mode(char *mode, char *pull) +{ + if (strcmp(mode, "out") == 0) + { + return GPIO_ModeOut_PP_5mA; + } + else if (strcmp(mode, "in") == 0) + { + if (strcmp(pull, "up") == 0) + { + return GPIO_ModeIN_PU; + } + else if (strcmp(pull, "down") == 0) + { + return GPIO_ModeIN_PD; + } + else + { + return GPIO_ModeIN_Floating; + } + } + else + { + return GPIO_ModeIN_Floating; + } +} diff --git a/package/CH582/ch582_utils.h b/package/CH582/ch582_utils.h new file mode 100644 index 000000000..b1fcec993 --- /dev/null +++ b/package/CH582/ch582_utils.h @@ -0,0 +1,9 @@ +#ifndef _CH582_UTILS_H_ +#define _CH582_UTILS_H_ +#include "stdint.h" + +uint8_t gpio_get_group(char *pin); +uint32_t gpio_get_pin(char *pin); +uint32_t gpio_get_mode(char *mode, char *pull); + +#endif diff --git a/package/CH582/pika_config.c b/package/CH582/pika_config.c new file mode 100644 index 000000000..c150f9beb --- /dev/null +++ b/package/CH582/pika_config.c @@ -0,0 +1,26 @@ +#include "PikaPlatform.h" +#include "printf.h" + + +void __platform_printf(char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vprintf_(fmt, args); + va_end(args); +} + +int __platform_vsnprintf(char *buff, size_t size, const char *fmt, va_list args) +{ + return vsnprintf_(buff, size, fmt, args); +} + +int __platform_sprintf(char *buff, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + int res = vsnprintf_(buff, PIKA_CONFIG_SPRINTF_BUFF_SIZE, fmt, args); + va_end(args); + return res; +} +