很开心能在电子发烧论坛参与武汉世源的CW32开发板试用活动,上个月一直想着把试用报告提交了,怎么奈何系统一直在维护中,以至于今天才提交测试报告,先介绍下CW32芯片,CW是ARM Cortex-M0架构的 32 位MCU,拥有64K 字节 FLASH和8K 字节 RAM,最高主频64MHz,拥有5通道的DMA,以及集成了UART,IIC,SPI,ADC等;
下面开始是用CW32测试的一款自动化设备
其部分代码如下:
- /*
- 系统时钟配置为64M
- LED1长亮
- OLED屏显示字符串
- */
- #include "main.h"
- #include "OLED_I2C.h"
- #include "LCD_calculate.h"
- #include "Lcd_Driver.h"
- void GPIO_Configuration(void);
- void RCC_Configuration(void);
- void ATIMER_init(void);
- #define position1 GPIO_ReadPin(CW_GPIOA,GPIO_PIN_0)
- #define position2 GPIO_ReadPin(CW_GPIOA,GPIO_PIN_1)
- #define position3 GPIO_ReadPin(CW_GPIOA,GPIO_PIN_4)
- #define position4 GPIO_ReadPin(CW_GPIOA,GPIO_PIN_5)
- #define position5 GPIO_ReadPin(CW_GPIOA,GPIO_PIN_6)
- #define position6 GPIO_ReadPin(CW_GPIOB,GPIO_PIN_12)
- #define disable_step GPIO_WritePin(CW_GPIOB,GPIO_PIN_14,GPIO_Pin_RESET) //拉低;//停止运行
- #define enable_step GPIO_WritePin(CW_GPIOB,GPIO_PIN_14,GPIO_Pin_SET) //拉高;//运行
-
- ///////////////////////////////////////////////////////////////////
- void delayms(unsigned int x)
- {
- unsigned char i, j;
- i = 18;
- j = 147;
- while(x--)
- {
- do
- {
- while (--j);
- } while (--i);
- }
- }
- ///////////////////////////////////////////////////////////////
- int main()
- {
- RCC_Configuration(); //系统时钟64M
- GPIO_Configuration(); //LED初始化
- Lcd_Init();
- Lcd_Clear(BLACK); //清屏
- ATIMER_init();
-
- Gui_DrawFont_GBK16(9,55,WHITE,BLACK,"智 能 贩 卖 鸡");
- Gui_DrawFont_GBK16(14,75,WHITE,BLACK," 测 试 系 统 ");
-
- while(1)
- {
- if(position1)
- {
- ATIM_Cmd(DISABLE); //定时器0关,停止计时
- disable_step; //停止
- delayms(500);//延时5秒
- ATIM_Cmd(ENABLE); //开定时继续运行
- enable_step; //拉高 开始
- while(position1)//防止重复检测
- delayms(100);//延时1秒 主要是让电机运转后先跳过检测
- }
- else if(position2)
- {
- ATIM_Cmd(DISABLE); //定时器0关,停止计时
- disable_step; //停止
- delayms(500);//延时5秒
- ATIM_Cmd(ENABLE); //开定时继续运行
- enable_step; //拉高 开始
- while(position2)//防止重复检测
- delayms(100);//延时1秒 主要是让电机运转后先跳过检测
- }
- else if(position3)
- {
- ATIM_Cmd(DISABLE); //定时器0关,停止计时
- disable_step; //停止
- delayms(500);//延时5秒
- ATIM_Cmd(ENABLE); //开定时继续运行
- enable_step; //拉高 开始
- while(position3)//防止重复检测
- delayms(100);//延时1秒 主要是让电机运转后先跳过检测
- }
- else if(position4)
- {
- ATIM_Cmd(DISABLE); //定时器0关,停止计时
- disable_step; //停止
- delayms(500);//延时5秒
- ATIM_Cmd(ENABLE); //开定时继续运行
- enable_step; //拉高 开始
- while(position4)//防止重复检测
- delayms(100);//延时1秒 主要是让电机运转后先跳过检测
- }
- else if(position5)
- {
- ATIM_Cmd(DISABLE); //定时器0关,停止计时
- disable_step; //停止
- delayms(500);//延时5秒
- ATIM_Cmd(ENABLE); //开定时继续运行
- enable_step; //拉高 开始
- while(position5)//防止重复检测
- delayms(100);//延时1秒 主要是让电机运转后先跳过检测
- }
- else if(position6)
- {
- ATIM_Cmd(DISABLE); //定时器0关,停止计时
- disable_step; //停止
- delayms(500);//延时5秒
- ATIM_Cmd(ENABLE); //开定时继续运行
- enable_step; //拉高 开始
- while(position6)//防止重复检测
- delayms(100);//延时1秒 主要是让电机运转后先跳过检测
- }
- }
- }
- ///////////////////////////////////////////////////////////////
- void RCC_Configuration(void)
- {
- /* 0. HSI使能并校准 */
- RCC_HSI_Enable(RCC_HSIOSC_DIV6);
- /* 1. 设置HCLK和PCLK的分频系数 */
- RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
- RCC_PCLKPRS_Config(RCC_PCLK_DIV1);
-
- /* 2. 使能PLL,通过PLL倍频到64MHz */
- RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, 8); // HSI 默认输出频率8MHz
- // RCC_PLL_OUT(); //PC13脚输出PLL时钟
-
- ///< 当使用的时钟源HCLK大于24M,小于等于48MHz:设置FLASH 读等待周期为2 cycle
- ///< 当使用的时钟源HCLK大于48MHz:设置FLASH 读等待周期为3 cycle
- __RCC_FLASH_CLK_ENABLE();
- FLASH_SetLatency(FLASH_Latency_3);
-
- /* 3. 时钟切换到PLL */
- RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
- RCC_SystemCoreClockUpdate(64000000);
-
- }
- ///////////////////////////////////////////////////////////////
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- __RCC_GPIOB_CLK_ENABLE();
- __RCC_GPIOC_CLK_ENABLE();
- __RCC_GPIOA_CLK_ENABLE();
- GPIO_InitStruct.IT = GPIO_IT_NONE; //input PA
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
- GPIO_InitStruct.Pins = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
- GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.IT = GPIO_IT_NONE; //input PB
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
- GPIO_InitStruct.Pins = GPIO_PIN_12;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
- GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.IT = GPIO_IT_NONE; //OUT PB
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pins = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
- GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
-
- GPIO_InitStruct.Pins = GPIO_PIN_13; //LED4
- GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
-
- GPIO_WritePin(CW_GPIOB,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_Pin_SET); //拉高
-
- GPIO_WritePin(CW_GPIOC,GPIO_PIN_13,GPIO_Pin_RESET); //拉低
- }
- ///////////////////////////////////////////////////////////////
- /**
- * [url=home.php?mod=space&uid=2666770]@Brief[/url] This funcation handles GPIOB
- */
- void GPIOB_IRQHandler(void)
- {
- /* USER CODE BEGIN */
- if (CW_GPIOB->ISR_f.PIN13) //pB13 test interrupt
- {
- CW_GPIOB->ICR_f.PIN13 = 0; // 清中断标志位
- PA07_TOG();
- }
- /* USER CODE END */
- }
- ///////////////////////////////////////////////////////////////
- void ATIMER_init(void)
- {
- ATIM_InitTypeDef ATIM_InitStruct;
-
- __RCC_ATIM_CLK_ENABLE();
-
- __disable_irq();
- NVIC_EnableIRQ(ATIM_IRQn);
- __enable_irq();
-
- ATIM_InitStruct.BufferState = ENABLE; //使能缓存寄存器
- ATIM_InitStruct.ClockSelect = ATIM_CLOCK_PCLK; //选择PCLK时钟计数
- ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_MODE_EDGE_ALIGN; //边沿对齐
- ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP; //向上计数;
- ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE; //连续运行模式
- ATIM_InitStruct.OverFlowMask = DISABLE; //重复计数器上溢出不屏蔽
- ATIM_InitStruct.Prescaler = ATIM_Prescaler_DIV8; // 8分频,8MHZ
- ATIM_InitStruct.ReloadValue = 8000; // 重载周期 1MS TIMER
- ATIM_InitStruct.RepetitionCounter = 0; // 重复周期0
- ATIM_InitStruct.UnderFlowMask = DISABLE; // 重复计数下溢出不屏蔽
- ATIM_Init(&ATIM_InitStruct);
- ATIM_ITConfig(ATIM_CR_IT_OVE, ENABLE); // 有重复计数器溢出产生进入中断
- ATIM_Cmd(ENABLE);
- }
- ///////////////////////////////////////////////////////////////
- void ATIM_IRQHandler(void)
- {
- static unsigned int count=0;
- if (ATIM_GetITStatus(ATIM_IT_OVF))
- {
- ATIM_ClearITPendingBit(ATIM_IT_OVF);
- count++;
- if(count>=5)//5ms
- {
- count=0;
- PB15_TOG();
- }
- }
- }
复制代码
https://www.bilibili.com/video/BV1G841127cQ/?spm_id_from=333.999.0.0&vd_source=c2cdc1b18ffac5c34a98ce5e1d479bc8
|