- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在让我的计算机(准确地说是虚拟 COM 端口)通过 DMA 和 USART 与 STM32L053R8T6 (Nucleo) 板进行通信时遇到问题。这是我的 DMA 和 USART 部分的代码:
#include "Device/Include/stm32l0xx.h" // Device header
#include "JB.h"
#include <string.h>
#define PCLK 32000000
#define BAUD 19200
uint8_t stringtosend[] = "test\n";
uint8_t stringtoreceive[] = " ";
void ENABLE_UART_DMA(void){
RCC->AHBENR |= RCC_AHBENR_DMA1EN; //enable periph.clk for DMA1
/**Enabling DMA for transmission
* DMA1, Channel 4 mapped for USART2TX
* USART2 TDR for peripheral address
* stringtosend for data address
* Memory increment, memory to peripheral | 8-bit transfer | transfer complete interrupt**/
DMA1_CSELR->CSELR = (DMA1_CSELR->CSELR & ~DMA_CSELR_C4S) | (4 << (3 * 4));
DMA1_Channel4->CPAR = (uint32_t)&(USART2->TDR);
DMA1_Channel4->CMAR = (uint32_t)stringtosend;
DMA1_Channel4->CCR = DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
/**Enabling DMA for reception
* DMA1, Channel 5 mapped for USART2RX
* USART2 RDR for peripheral address
* stringtoreceive for data address
* Data size given
* Memory increment, peripheral to memory | 8-bit transfer | transfer complete interrupt**/
DMA1_CSELR->CSELR = (DMA1_CSELR->CSELR & ~DMA_CSELR_C5S) | (4 << (4 * 4));
DMA1_Channel5->CPAR = (uint32_t)&(USART2->RDR);
DMA1_Channel5->CMAR = (uint32_t)stringtoreceive;
DMA1_Channel5->CNDTR = sizeof(stringtoreceive);
DMA1_Channel5->CCR = DMA_CCR_MINC | DMA_CCR_TCIE | DMA_CCR_EN;
NVIC_SetPriority(DMA1_Channel4_5_6_7_IRQn, 0); //NVIC enabled, max priority, channels 4-7
NVIC_EnableIRQ(DMA1_Channel4_5_6_7_IRQn);
}
void CONFIGURE_UART_PARAM(void){
RCC->IOPENR |= ( 1ul << 0); //Enable GPIOA clock
RCC->APB1ENR |= ( 1ul << 17); //Enable USART#2 clock
GPIOA->AFR[0] &= ~((15ul << 4* 3) | (15ul << 4* 2) ); //Clear PA2,PA3
GPIOA->AFR[0] |= (( 4ul << 4* 3) | ( 4ul << 4* 2) ); //Set PA2,PA3
GPIOA->MODER &= ~(( 3ul << 2* 3) | ( 3ul << 2* 2) ); //Same as above
GPIOA->MODER |= (( 2ul << 2* 3) | ( 2ul << 2* 2) );
USART2->BRR = PCLK/BAUD;
USART2->CR3 = USART_CR3_DMAT | USART_CR3_DMAR; //Enable DMA mode in transmit and receive
/*UART enabled for transmission and reception*/
USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
while((USART2->ISR & USART_ISR_TC) != USART_ISR_TC)
{
/* add time out here for a robust application */
}
USART2->ICR = USART_ICR_TCCF;
}
void CONFIGURE_EXTI(void){
SYSCFG->EXTICR[0] = ((SYSCFG->EXTICR[0] & 0x0000) | SYSCFG_EXTICR4_EXTI13_PC); //clear EXTICR and set to PC13(B1)
EXTI->FTSR |= EXTI_FTSR_TR13; //falling edge trigger
EXTI->IMR |= EXTI_IMR_IM13; //unmask
NVIC_SetPriority(EXTI4_15_IRQn, 0); //def interrupt
NVIC_EnableIRQ(EXTI4_15_IRQn);
}
/*************************************************************************************************************************************************************************************************************************/
/*************************************************************************************************************************************************************************************************************************/
/*Interrupt Handlers*/
void DMA1_Channel4_5_6_7IRQHandler(void){
if((DMA1->ISR & DMA_ISR_TCIF4) == DMA_ISR_TCIF4){
DMA1->IFCR = DMA_IFCR_CTCIF4; //Clear Channel 4 Transfer Complete flag
}
else if((DMA1->ISR & DMA_ISR_TCIF5) == DMA_ISR_TCIF5){
DMA1->IFCR = DMA_IFCR_CTCIF5; //Clear Channel 5 Transfer Complete flag
DMA1_Channel5->CCR &= ~DMA_CCR_EN;
DMA1_Channel5->CNDTR = sizeof(stringtoreceive);/* Data size */
DMA1_Channel5->CCR |= DMA_CCR_EN;
}
}
void EXTI4_15_IRQHandler(void){
if(!(GPIOC->IDR & (1 << 13))){
/* Clear EXTI 13 flag */
EXTI->PR = EXTI_PR_PIF13;
/* start 8-bit transmission with DMA */
DMA1_Channel4->CCR &= ~DMA_CCR_EN; //channel disable
DMA1_Channel4->CNDTR = sizeof(stringtosend);/* Data size */
DMA1_Channel4->CCR |= DMA_CCR_EN; //channel enable
}
}
//void EXTI4_15_IRQHandler(void){
// if((EXTI->PR & EXTI_PR_PIF13) == EXTI_PR_PIF13){
// /* Clear EXTI 13 flag */
// EXTI->PR = EXTI_PR_PIF13;
//
// /* start 8-bit transmission with DMA */
// DMA1_Channel4->CCR &= ~DMA_CCR_EN; //channel disable
// DMA1_Channel4->CNDTR = sizeof(stringtosend);/* Data size */
// DMA1_Channel4->CCR |= DMA_CCR_EN; //channel enable
// }
//}
现在,该特定代码基于 STM32L0 代码片段包 1.20“使用 DMA 的 USART/通信”中的示例。 USART 1 被简单地重新定义为 USART 2(因为这是虚拟 COM 端口使用的端口),并且 DMA channel 也据此重新定义。然而,这里的问题非常简单:它只会打印 stringtosend 一次(希望每次按下按钮 B1 时都执行一次),并且也不会通过 RX 接收数据 - 就好像它完全忽略 DMA 中断处理程序一样 - 我是这样的我不确定如何测试(该板上没有可用的跟踪功能)。我所拥有的似乎很好地反射(reflect)了引用手册,所有主要内容是:
int main(){
SystemCoreClockInit();
CONFIGURE_UART_PARAM();
ENABLE_UART_DMA();
pushbutton_def();
CONFIGURE_EXTI();
while(1){
}
...它应该只对定义的中断使用react,但是它没有,并且对于我的一生,我不明白为什么。如果你能帮助我,我会很高兴 - 我也想避免 HAL 或 LL API - 这不是一个足够复杂的项目,无法保证它们的使用(多个输入、输出、两个板之间通过 USART/DMA 进行通信),另外我会更喜欢学习更接近寄存器级别的工作。
谢谢!
编辑(响应贝伦迪的建议):1. GPIOC在另一个文件中定义,用pushbutton_def()调用:
RCC->IOPENR |= (1UL << 2); //enable GPIOC
我完全理解你的解释的意思(事实上,这两个引用的寄存器是“相同的”,0x00000020U),但我不确定如何重新定义它:这是我之后的尝试查看引用手册(SYSCFG部分)和源代码(仍然不起作用):
SYSCFG->EXTICR[3] = ((SYSCFG->EXTICR[3] & 0x0000) | SYSCFG_EXTICR4_EXTI13_PC);
按照建议,我已将 USART2->ICR = USART_ICR_TCCF;
添加到 EXTIhandler,位于 DMA channel 之后。我将其保留在 USART 定义中。不过,该消息仍然只发送一次。
最佳答案
GPIOC
未启用
这里,
RCC->IOPENR |= ( 1ul << 0); //Enable GPIOA clock
您也应该启用GPIOC
。
EXTI13
映射到 PA13
这里,
SYSCFG->EXTICR[0] = ((SYSCFG->EXTICR[0] & 0x0000) | SYSCFG_EXTICR4_EXTI13_PC); //clear EXTICR and set to PC13(B1)
您正在设置EXTI0
-EXTI3
的配置寄存器,实际上将EXTI1
映射到PC1
。 EXTI13
仍然映射到 PA13
,它实际上是 SWDIO
,连接到板载调试器。我猜想 SWDIO
上的流量会触发 EXTI 中断,处理程序会检查 PC13
(由于端口被禁用而始终读取 0),并启用 DMA。不过 DMA 传输只能工作一次,因为
USART_ISR_TC
在中断中没有被清除
但仅在启动时一次。您应该移动此行
USART2->ICR = USART_ICR_TCCF;
到 EXTI 中断处理程序。
我不确定为什么接收不起作用,也许 DMA 处理程序没有机会运行,因为 EXTI 不断被 SWD 流量重新触发。两个中断具有相同的优先级,中断号较小的中断优先,即 EXTI 处理程序。如果它总是在完成之前重新触发,那么它将被再次调用,而不是让其他处理程序运行。
关于c - 让 DMA USART 在 STM32L053R8T6 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49602503/
我在通过 USART 接收数据时遇到了一些麻烦。我真正想要实现的是,我可以通过 USART 接收没有特定长度(只有最大可能长度)的命令。所以我使用中断例程来检查接收到的每个字符,但不知何故我仍然无法实
我有一个问题,我必须用 USART 按下我电脑上的键来控制 ATMEGA 1280 的 PWM。我可以使用 ASCII 键和控制 PWM 来控制它。问题是他们要求使用箭头键,现在问题是箭头键没有 AS
我目前正在开展一个项目,我们必须使用 AVR ATMEGA328 微 Controller (特别是 USART 外设)来控制 8 个 LED。我们必须向微 Controller 发送命令,以不同的速
我正在使用具有 16kb 闪存和 1kb Sram 的 AVR Controller atmega16。我已将数据存储在静态数组中,即 static char raw_data[15361]; 并尝试
我试图在同一个全局数组上发送 2 个不同的字符串,并通过 UART 传输 DMA,作为我的终端日志。然而,发生的情况是它发送了第一个字符串,无论我尝试什么(重新初始化整个 DMA 和 UART),它都
我有一个使用 tx 中断传输数据的 USART 类。现在我想创建一个使用 DMA 传输数据的变体。你想要什么: 使用继承来创建两个 USART 子类,例如ISRUSART 和 DMAUSART? 或
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我正在为 ARM Cortex M3 编程。我有在 USART 端口上运行的标准输出功能。我应该如何在我的 Windows 7 计算机上监控我的开发板通过 USART 发送的数据?我应该使用标准的“U
我正在尝试将 HC-05 与我的 STM32F3 DISCOVERY 结合使用,但我无法让 USART 正常工作。 无论我手动从 HC-05 读取数据还是使用中断,它都不起作用。 我尝试在 ardui
在 STM32F2 上使用两个以 115200 波特运行的 USART,一个用于与 radio 模块通信,一个用于从 PC 进行串行通信。时钟速度为 120MHz。 当同时从两个 USART 接收数据
我正在为内置 PIC18F25K80 的板编写一些库。现在我正在尝试对 UART 库进行编程,并且我已经尝试了所有方法,但在发送字符串时我无法使其工作。 我正在使用 XC8 编译器,并且库中有以下代码
我的 USART 正在从“黑匣子”接收一个字符串,该字符串包含两个 double 值和几个十六进制值。该字符串放置在我的缓冲区 rbuf.buf 中,总大小为 32 个字符。通常我会收到 19 个字符
使用下面的测试代码,我尝试使用 中的 simulator 通过 xmega128a3u 的 USART 发送数据Atmel Studio. 观察 I/O 查看数据寄存器从未设置,即使我正在设置它。是我
您好,我目前正在研究 USART 通信,试图从任何 GPIO 引脚传输和接收数据。 我成功地以任何波特率传输数据,但在接收时卡住了。 我一次能收到一个角色。引脚设置为使用 RX 引脚的外部下降沿中断。
我正在尝试使用 USART 通信接收和发送数据,我使用的是 atmega16。我在 PC 中创建了一个程序来将字符串发送到 micro,如果字符串匹配,micro 将激活 adc 并将 adc 数据发
我在尝试读取完整的字符串时遇到了一些问题和奇怪的行为。我正在使用配备 atxmega32a4u 的自制演示板,基本上我想做的是通过串行通信设置一个参数(输出电压设定点),而 MCU 做他的事情(控制降
这是我在 stm8l 中使用 usart 的代码。我面临的主要问题是,无论我为 USART_DR 寄存器分配什么值,它始终采用值 0xff 而不会随着我增加 char 变量而改变。只有 USART_S
我正在研究一个名为 TSL2301 的线扫描 ccd 传感器。我想通过 stm32f103 的 USART 读取像素,但我总是只能收到 0xFF,有人使用这个传感器来帮助我吗?我使用了 STM32f1
我使用带有 AVR Studio 5 的 EVK1105 开发板作为我的 AVR 项目的开发 IDE。我在其中使用 FreeRTOS。我在这个板上有 3 个 USART 端口。一个外部模块通过 USA
我是在 Atmel studio 环境中开发嵌入式系统的新手,我使用 Atxmega128a1 和 32MHz 系统时钟。我试图在每次定时器中断溢出(0.05s)时通过RS232模块向PC发送一些字符
我是一名优秀的程序员,十分优秀!