首页 > 评测 > 基于PikaScript在MM32平台上部署Python开发环境
基于PikaScript在MM32平台上部署Python开发环境
- [导读]
- MicroPython是Python3的精简实现,包括Python标准库的一小部分,经过优化可在微控制器和受限的环境中运行,在官方提供了相应的
- 准备模板工程
- 获取PikaScript源码和工具集
- 预编译模块
- 添加源码
- 调整堆栈大小
- 启动PikaScript
- void MCU_InitClock(void)
- {
- /* 使能内部高速时钟HSI */
- RCC->CR |= RCC_CR_HSION_MASK;
- /* 等待内部高速时钟HSI稳定 */
- while(RCC_CR_HSIRDY_MASK != (RCC->CR & RCC_CR_HSIRDY_MASK));
- /* 选择HSI输出用作系统时钟 */
- RCC->CFGR = RCC_CFGR_SW(0u);
- /* 等待系统时钟选择状态稳定 */
- while(RCC_CFGR_SWS(0u) != (RCC->CFGR & RCC_CFGR_SWS_MASK));
- /* 复位除HSI之外的所有时钟 */
- RCC->CR = RCC_CR_HSION_MASK;
- RCC->CIR = RCC->CIR; /* 清除中断标志位 */
- RCC->CIR = 0u; /* 禁卡相应的中断 */
- /* PWR/DBG时钟使能 */
- RCC->APB1ENR |= (1u << 28u);
- /* 如果系统时钟需要达到最大频率120MHz时, 需要将VOS设置为1.7V */
- PWR->CR1 = (PWR->CR1 & ~PWR_CR1_VOS_MASK) | PWR_CR1_VOS(3u);
- /* 使能外部高速时钟HSE */
- RCC->CR |= RCC_CR_HSEON_MASK;
- /* 等待外部高速时钟HSE稳定 */
- while(RCC_CR_HSERDY_MASK != (RCC->CR & RCC_CR_HSERDY_MASK));
- /* PLL1 = HSE * (MUL + 1) / (DIV + 1)
- = 12MHz * 20 / 2
- = 120MHz
- */
- RCC->PLL1CFGR = RCC_PLL1CFGR_PLL1SRC(1) | /* 0:HSI作为PLL1时钟源, 1:HSE作为PLL1时钟源 */
- RCC_PLL1CFGR_PLL1MUL(19)| /* PLL1倍频系数 */
- RCC_PLL1CFGR_PLL1DIV(1) | /* PLL1分频系数 */
- RCC_PLL1CFGR_PLL1LDS(1) | /* PLL1锁定检测器精度选择: 高精度 */
- RCC_PLL1CFGR_PLL1ICTRL(3); /* PLL1输入时钟源大于等于8MHz时,推荐设置值为2'b11
- PLL1输入时钟源小于 8MHz时,推荐设置值为2'b01 */
- /* 使能PLL1 */
- RCC->CR |= RCC_CR_PLL1ON_MASK;
- /* 等待PLL1稳定 */
- while((RCC->CR & RCC_CR_PLL1RDY_MASK) == 0);
- /* FLASH时钟使能 */
- RCC->AHB1ENR |= (1u << 13u);
- FLASH->ACR = FLASH_ACR_LATENCY(4u) | /* 0 : 零个等待状态, 当 0MHz < SYSCLK <= 24MHz
- 1 : 一个等待状态, 当24MHz < SYSCLK <= 48MHz
- 2 : 二个等待状态, 当48MHz < SYSCLK <= 72MHz
- 3 : 三个等待状态, 当72MHz < SYSCLK <= 96MHz
- 4 : 四个等待状态, 当96MHz < SYSCLK <= 120MHz */
- FLASH_ACR_PRFTBE_MASK; /* 预取缓冲区开启 */
- /* 时钟配置 */
- RCC->CFGR = RCC_CFGR_HPRE(0) | /* AHB 预分频系数, HCLK
- 0xxx : SYSCLK 不分频
- 1000 : SYSCLK 2分频
- 1001 : SYSCLK 4分频
- 1010 : SYSCLK 8分频
- 1011 : SYSCLK 16分频
- 1100 : SYSCLK 64分频
- 1101 : SYSCLK 128分频
- 1110 : SYSCLK 256分频
- 1111 : SYSCLK 512分频 */
- RCC_CFGR_PPRE1(0x4) | /* APB1预分频系数, PCLK1
- 0xx : HCLK 不分频
- 100 : HCLK 2分频
- 101 : HCLK 4分频
- 110 : HCLK 8分频
- 111 : HCLK 16分频 */
- RCC_CFGR_PPRE2(0x4) | /* APB2预分频系数, PCLK2
- 0xx : HCLK 不分频
- 100 : HCLK 2分频
- 101 : HCLK 4分频
- 110 : HCLK 8分频
- 111 : HCLK 16分频 */
- RCC_CFGR_MCO(7); /* MCO输出时钟源选择
- 000x : 没有时钟输出
- 0010 : LSI时钟输出
- 0011 : LSE时钟输出
- 0100 : SYSCLK时钟输出
- 0101 : HSI时钟输出
- 0110 : HSE时钟输出
- 0111 : PLL1时钟输出
- 1000 : PLL2时钟输出 */
- /* ADC1预分频(频率范围15MHz - 48MHz)
- = PCLK2 / (PRE + 2),要求PRE为偶数,使占空比为50%
- = 60MHz / ( 2 + 2)
- = 15MHz */
- RCC_SetADCClockDiv(ADC1, 2);
- /* ADC1 calibration时钟分频(频率范围187.5kHz - 1.5MHz)
- = PCLK2 / (PRECAL + 2),要求PRECAL为偶数,使占空比为50%
- = 60MHz / (58 + 2)
- = 1MHz */
- RCC_SetADCClockDiv(ADC1, 58);
- /* 选择PLL输出用作系统时钟 */
- RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW_MASK) | RCC_CFGR_SW(2);
- /* 等待系统时钟选择状态稳定 */
- while((RCC->CFGR & RCC_CFGR_SWS_MASK) != RCC_CFGR_SWS(2));
- }
- void MCU_InitUART1(void)
- {
- GPIO_Init_Type GPIO_InitStructure;
- UART_Init_Type UART_InitStructure;
- /* 先配置GPIO, 再配置UART参数, 否则UART ENABLE后会有一个0xFF的异常字节 */
- RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOB, true);
- GPIO_PinAFConf(GPIOB, GPIO_PIN_6, GPIO_AF_7); /* PB6 <-> UART1_TX */
- GPIO_PinAFConf(GPIOB, GPIO_PIN_7, GPIO_AF_7); /* PB7 <-> UART1_RX */
- GPIO_InitStructure.Pins = GPIO_PIN_6;
- GPIO_InitStructure.PinMode = GPIO_PinMode_AF_PushPull;
- GPIO_InitStructure.Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.Pins = GPIO_PIN_7;
- GPIO_InitStructure.PinMode = GPIO_PinMode_In_Floating;
- GPIO_InitStructure.Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_UART1, true);
- UART_InitStructure.ClockFreqHz = CLOCK_APB2_FREQ;
- UART_InitStructure.BaudRate = 115200;
- UART_InitStructure.WordLength = UART_WordLength_8b;
- UART_InitStructure.StopBits = UART_StopBits_1;
- UART_InitStructure.Parity = UART_Parity_None;
- UART_InitStructure.XferMode = UART_XferMode_RxTx;
- UART_InitStructure.HwFlowControl = UART_HwFlowControl_None;
- UART_Init(UART1, &UART_InitStructure);
- UART_Enable(UART1, true);
- }
- int fputc(int ch, FILE *f)
- {
- UART_PutData(UART1, (uint8_t)ch);
- while((UART_GetStatus(UART1) & UART_STATUS_TX_DONE) == 0);
- return ch;
- }
- int fgetc(FILE *f)
- {
- while((UART_GetStatus(UART1) & UART_STATUS_RX_DONE) == 0u);
- return UART_GetData(UART1);
- }
- void InitSystem(void)
- {
- MCU_InitClock();
- MCU_InitUART1();
- }
- int main(void)
- {
- InitSystem();
- printf("\r\n");
- printf("\r\nPikaScript PLUS-F5270(MM32F5277E9P) %s %s", __DATE__, __TIME__);
- printf("\r\n");
- printf("\r\n------------------------------------------------------------------");
- printf("\r\n| |");
- printf("\r\n| ____ _ __ _____ _ __ |");
- printf("\r\n| / __ \\ (_) / /__ ____ _ / ___/ _____ _____ (_) ____ / /_ |");
- printf("\r\n| / /_/ // / / //_// __ `/ \\__ \\ / ___// ___// / / __ \\ / __/ |");
- printf("\r\n| / ____// / / ,< / /_/ / ___/ // /__ / / / / / /_/ // /_ |");
- printf("\r\n| /_/ /_/ /_/|_| \\__,_/ /____/ \\___//_/ /_/ / .___/ \\__/ |");
- printf("\r\n| /_/ |");
- printf("\r\n| PikaScript - An Ultra Lightweight Python Engine |");
- printf("\r\n| |");
- printf("\r\n| [ https://github.com/pikastech/pikascript ] |");
- printf("\r\n| [ https://gitee.com/lyon1998/pikascript ] |");
- printf("\r\n| |");
- printf("\r\n------------------------------------------------------------------");
- printf("\r\n");
- PikaObj *pikaMain = pikaScriptInit();
- goto main_loop;
- main_loop:
- pikaScriptShell(pikaMain);
- /* after exit() from pika shell */
- NVIC_SystemReset();
- }
- char __platform_getchar(void)
- {
- return getchar();
- }
- 在线运行Python脚本程序
- 本文系21ic原创,未经许可禁止转载!
网友评论
- 联系人:巧克力娃娃
- 邮箱:board@21ic.com
- 我要投稿
-
欢迎入驻,开放投稿
-
人均百万?英伟达中国员工收入曝光! 2024-08-29
-
《黑神话:悟空》玩家硬盘升级攻略:提升游戏体验,畅享3A大作 2024-08-29
-
数睿数据参加《系统与软件工程 低代码开发平台通用技术要求》国家标准编制 2024-08-29
- NRF52810蓝牙数字耳机找人定制
预算:¥30005天前
- 125KW模块式PCS软硬件外包开发
预算:¥1100000015小时前
- 12V汽车启动电源项目BMS设计
预算:¥50000023小时前
- 数据可视化软件 开发
预算:¥5000023小时前
- PLC项目调试修改
预算:¥100001天前
- 起动电机控制器开发
预算:¥1100001天前