你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32C0评测】2、工程建立,点灯,按键,串口使用

[复制链接]
Teresa 发布时间:2024-3-18 18:05

工程建立

我采用了keil5进行了工程的建立,具体工程结构如图:

image.png

User:存放maic.c

Bsp:底层驱动的初始化与调用

MDK-ARM:存放startup.s启动文件

CMSIS:ST提供的系统C文件

Driver:Hal库文件

Doc:存放readme

App:存放业务层的函数

LED驱动

bsp_led.c提供了LED的驱动初始化函数:

头文件声明:

#define ALL_LED_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE();

#define LED_PORT GPIOA

#define LED_PIN GPIO_PIN_5

初始化函数:

void bsp_LED_Init(void)

{

GPIO_InitTypeDef gpio_init_struct;

ALL_LED_GPIO_CLK_ENABLE();

gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
gpio_init_struct.Pull = GPIO_PULLUP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
gpio_init_struct.Pin = LED_PIN;
HAL_GPIO_Init(LED_PORT, &gpio_init_struct);
}

主函数里面使用Hal库提供的HAL_GPIO_TogglePin()进行测试

按键驱动

虽然板子上只提供了一个按键,但是本着要做就做到全部的原则,还是使用了按键FIFO,首先是初始化

头文件声明:

#define ALL_KEY_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE();

#define KEY_1_PORT GPIOC

#define KEY_1_PIN GPIO_PIN_13

初始化代码:

static void bsp_KEY_InitHard(void)
{
    GPIO_InitTypeDef gpio_init_struct;

    ALL_KEY_GPIO_CLK_ENABLE();

    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Pull = GPIO_NOPULL;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    gpio_init_struct.Pin = KEY_1_PIN;
    HAL_GPIO_Init(KEY_1_PORT, &gpio_init_struct);
}

按键的代码和LED的代码是完全一致的,不过就是加入了按键的轮询和队列的出入函数,轮询是通过systick中断实现的,每10ms轮询一次,使用FIFO保证不会丢失按键次数

按键的FIFO声明:

/* 按键FIFO的深度 */
#define KEY_FIFO_SIZE       10
typedef struct 
{
    uint8_t Buf[KEY_FIFO_SIZE];         /* 键值缓冲区 */
    uint8_t Read;                       /* 缓冲区读指针 */
    uint8_t Write;                      /* 缓冲区写指针 */
}KEY_FIFO_T;

按键的读取函数:

static uint8_t IsKeyDown1(void) {if ((KEY_1_PORT->IDR & KEY_1_PIN) == 0) return 0;else return 1;}

通过在systick中断中轮询该函数,并且将所得数据压入FIFO队列。保证按键不丢失

systick初始化

SysTick_Config(SystemCoreClock / 1000);

1ms一次的systick中断

串口使用

串口使用的过程中就发现了,毕竟是新时代的芯片,底层寄存器是完全不同的了,并且C0也加入了串口硬件FIFO,但是我在串口初始化中,并没有看到能够控制硬件FIFO的开关

image.png

image.png

估计是通过hal库的函数来控制的,不过暂时还没进行研究,但是这个串口的各种功能可以说是全部上齐了。

于是乎,只能依靠手册重新修改底层,以适应C0平台

    CLEAR_BIT(USART1->ISR, USART_ISR_TC);
    CLEAR_BIT(USART1->ISR, USART_ISR_RXNE_RXFNE);

    SET_BIT(USART1->CR1, USART_CR1_RXNEIE_RXFNEIE);

不过也就是操作了一下新的中断和状态寄存器ISR(之前是状态寄存器SR),清除了发送完成标志与接收标志位,然后操作了控制寄存器1,使能了RXFNEIE RXFIFO非空中断。其他的操作与之前的HAL库初始化串口没什么区别。

需要发送的时候就将数据压入FIFO然后使能控制寄存器1的TXFNFIE TXFIFO未满中断,将数据发送,简单的代码实现如下

        Uart->pTxBuf[_pUart->usTxWrite] = _ucaBuf[i];

        DISABLE_INT();
        if (++Uart->usTxWrite >= Uart->usTxBufSize)
        {
            Uart->usTxWrite = 0;
        }
        Uart->usTxCount++;
        ENABLE_INT();

        SET_BIT(Uart->uart->CR1, USART_CR1_TXEIE_TXFNFIE);

测试

image.png

主函数大循环里面每点击一下,就发送“STM32C0 demo”,连点多次,测试完毕没有问题。

后续

STM32C0虽然是入门级别的芯片,但是ST应该是把能给的功能全部给齐了,就我现在看到的串口来说,串口FIFO,自动波特率,Tx/Rx引脚互换等等主流,有用的功能全部都加入了。作为入门,能够一次性把全部功能都给玩转是非常不错的了。我甚至在手册里面发现了“互联矩阵”,属于是没有见过的新功能,等待继续探索

image.png

关于BUG

因为我是直接移植了成熟的程序到C0平台,并且只做了简单的测试,还是发现了BUG,串口硬件FIFO处的操作有问题。导致上一次压入的数据如果没有发送,会和下一次的数据一起出现。最简单的方法应该是关闭硬件的FIFO,因为我自己使用了软件FIFO,但是新的平台就应该全部都尝试尝试。等待我再试试别的方法 [/i]

收藏 评论0 发布时间:2024-3-18 18:05

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版