add ch582 support package

This commit is contained in:
dreamcmi 2022-03-26 20:46:22 +08:00
parent f60625c888
commit 7cdb0cf9ed
No known key found for this signature in database
GPG Key ID: 1AEAA4F80C165CF5
9 changed files with 661 additions and 0 deletions

93
package/CH582/CH582.py Normal file
View File

@ -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

109
package/CH582/ch582_adc.c Normal file
View File

@ -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.");
}
}

View File

@ -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);
}
}

78
package/CH582/ch582_iic.c Normal file
View File

@ -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);
}

View File

@ -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);
}
}

166
package/CH582/ch582_uart.c Normal file
View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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

View File

@ -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;
}