STM32
直播中

山中老虎

9年用户 1014经验值
擅长:制造/封装
私信 关注
[问答]

stm8l的USART+DMA如何使用?

请问大家8L的USART+DMA如何使用啊,程序如下没有发送数据。
void USART1_Send(unsigned char n)
{

       while(!USART_GetFlagStatus (USART1,USART_FLAG_TXE));//等待发送完毕
       USART_SendData8(USART1,n);     //发送数据               
}

void DMA_Config(void)
{
  DMA_GlobalDeInit();
  DMA_DeInit(DMA1_Channel0);
  DMA_Init(DMA1_Channel0,(unsigned int)( ii),(unsigned int)(USART1_BASE+0x01),1,
           DMA_DIR_MemoryToPeripheral,DMA_Mode_Circular,DMA_MemoryIncMode_Inc,DMA_Priority_Medium,DMA_MemoryDataSize_HalfWord);

  DMA_Cmd(DMA1_Channel0,ENABLE);
  DMA_GlobalCmd(ENABLE);

}

void main(void)
{

    asm("rim");


    GPIO_Init(GPIOD,GPIO_Pin_4,GPIO_Mode_Out_PP_Low_Slow);

    GPIO_Init(GPIOB,GPIO_Pin_6,GPIO_Mode_In_PU_No_IT);

    CLK_PeripheralClockConfig (CLK_Peripheral_USART1,ENABLE);//开启USART时钟

    CLK_PeripheralClockConfig (CLK_Peripheral_DMA1,ENABLE);



    USART_Init(USART1,9600,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx);//USART初始化,9600,8N1

    USART_Cmd (USART1,ENABLE);//使能USART

    USART_DMACmd(USART1,USART_DMAReq_TX,ENABLE);



回帖(1)

h1654155272.9717

2024-5-10 17:07:06
STM8L的USART+DMA使用步骤如下:

1. 配置USART:首先,需要配置USART的波特率、数据位、停止位等参数。可以使用STM8L的库函数进行配置。

```c
void USART1_Config(void) {
    USART_InitTypeDef USART_InitStructure;

    USART_InitStructure.USART_BaudRate = 9600; // 设置波特率为9600
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 设置数据位为8位
    USART_InitStructure.USART_StopBits = USART_StopBits_1; // 设置停止位为1位
    USART_InitStructure.USART_Parity = USART_Parity_No; // 设置无奇偶校验位
    USART_InitStructure.USART_SyncMode = USART_SyncMode_Disable; // 设置同步模式为禁用
    USART_InitStructure.USART_Mode = USART_Mode_Tx; // 设置USART模式为发送模式

    USART_Init(USART1, &USART_InitStructure); // 初始化USART1
    USART_Cmd(USART1, ENABLE); // 使能USART1
}
```

2. 配置DMA:接下来,需要配置DMA的通道、源地址、目标地址、数据大小等参数。

```c
void DMA_Config(void) {
    // 首先初始化DMA
    DMA_DeInit(DMA1_Channel0);
    // 然后配置DMA参数
    DMA_Init(DMA1_Channel0, DMA_PeripheralBaseAddr, (uint16_t)&USART1_DR_L, DMA_MemoryBaseAddr, DMA_BufferSize, DMA_DIR_PeripheralSRC, DMA_Mode_Normal, DMA_Priority_High, DMA_M2M_Disable);
    // 使能DMA通道
    DMA_Cmd(DMA1_Channel0, ENABLE);
}
```

3. 配置USART的DMA请求:在USART的配置中,需要使能DMA发送请求。

```c
void USART1_DMA_Config(void) {
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); // 使能USART1的DMA发送请求
}
```

4. 发送数据:使用DMA发送数据时,需要将数据放入DMA的内存地址中,然后启动DMA传输。

```c
void USART1_Send_DMA(uint8_t *data, uint16_t length) {
    // 设置DMA的内存地址和数据长度
    DMA_SetCurrDataCounter(DMA1_Channel0, length);
    DMA_SetCurrAddr(DMA1_Channel0, (uint16_t)data);

    // 启动DMA传输
    DMA_Cmd(DMA1_Channel0, ENABLE);
}
```

5. 在主函数中调用上述函数进行配置和发送数据。

```c
int main(void) {
    uint8_t data[] = {0x01, 0x02, 0x03, 0x04}; // 示例数据
    uint16_t length = sizeof(data);

    // 配置USART
    USART1_Config();
    // 配置DMA
    DMA_Config();
    // 配置USART的DMA请求
    USART1_DMA_Config();

    // 使用DMA发送数据
    USART1_Send_DMA(data, length);

    while (1) {
        // 其他任务
    }
}
```

注意:在实际应用中,需要根据具体的硬件连接和需求调整配置参数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分