|
沁恒又在组织竞赛了,本次使用CH32V317做主控,主要由于它兼顾了性能与价格。先熟悉一下开发环境MRSII,顺手使用Systick来闪烁一下LED灯。
沁恒CH32V317开发板与其它家不同,CH32V317的LED灯引脚并未连接到CH32V317的固定引脚之上,所以,我们必须再使用杜邦线将LED灯引脚与GPIO连接。——我开始还以为是原理图不完整呢!
我把LED灯与PA0,PA1相连,结合原理图并对PA0,PA1两个引脚设置为开涮模式。当GPIO输出0时,打开LED灯,输出1时,关闭LED灯。GPIO的初始化配置代码如下:
- void led_init (void) {
- GPIO_InitTypeDef GPIO_InitStructure = {0};
- RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init (GPIOC, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_Init (GPIOC, &GPIO_InitStructure);
- }
平时在Cortex-M系列下开发项目,常常用到Systick中断。使用它来做时基,简单方便,也物尽其用。所以,在RISC-V的CH32V317中依旧使用Systick产生1ms的时基,并用来控制LED的闪烁频率。Systick的初始化配置代码如下:
- void systick_config(uint64_t ticks)
- {
- SysTick->SR &= ~(1 << 0); // clear State flag
- SysTick->CMP = ticks - 1;
- SysTick->CNT = 0;
- SysTick->CTLR = 0xF;
- NVIC_SetPriority(SysTicK_IRQn, 15);
- NVIC_EnableIRQ(SysTicK_IRQn);
- }
再通过简单的查询方式实现LED灯的闪烁功能,两个LED灯一个1Hz,一个0.5Hz闪烁。
- void led_output (uint8_t id, uint8_t onoff) {
- switch (id) {
- case 0: {
- if (onoff == 0) {
- GPIO_WriteBit (GPIOC, GPIO_Pin_0, Bit_SET);
- } else {
- GPIO_WriteBit (GPIOC, GPIO_Pin_0, Bit_RESET);
- }
- break;
- }
- case 1: {
- if (onoff == 0) {
- GPIO_WriteBit (GPIOC, GPIO_Pin_1, Bit_SET);
- } else {
- GPIO_WriteBit (GPIOC, GPIO_Pin_1, Bit_RESET);
- }
- break;
- }
- default:
- break;
- }
- }
- int main (void) {
- timebase_tick = 0;
- NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2);
- systick_config (SystemCoreClock / 1000);
- log_init();
- led_init();
- while (1) {
- if (timebase_tick == 0) {
- timebase_tick = 1000;
- logprintf ("log time: %d:%d\r\n", log_time.sec, log_time.msec);
- }
- if (led_tick[0] == 0) {
- led_tick[0] = 500;
- if (led_status[0] == 0) {
- led_status[0] = 1;
- led_output (0, 1);
- } else {
- led_status[0] = 0;
- led_output (0, 0);
- }
- }
- if (led_tick[1] == 0) {
- led_tick[1] = 1000;
- if (led_status[1] == 0) {
- led_status[1] = 1;
- led_output (1, 1);
- } else {
- led_status[1] = 0;
- led_output (1, 0);
- }
- }
- }
- }
整个开发环境搭建还是相当轻松,直接在MRSII中新建工程即可,软件代码框架沁恒已为大家准备好,并且其分层也符合主流软件架构。如果之前有嵌入式开发经验,转入到RISC-V内核开发并不会增加多少学习成本。
|