我正在使用HAL驱动程序和CubeMX生成的代码.在我打电话的主要例程中HAL_UART_Receive_IT().通过UART传输数据(以环回方式连接)后,我可以看到模块正在接收字节并在寄存器中设置RXNE位.但是没有产生中断?我无法解释为什么......在HAL_UART_Receive_IT()函数中有代码启用中断,所以有什么问题?
我正在研究如何实现自定义 C++ HAL,该 HAL 面向多个微控制器,可能具有不同的架构(ARM、AVR、PIC 等),同时保持一切正常。
我继承了几个大型的、凌乱的代码库,它们在当前状态下无法维护,因此需要更结构化的东西。
在挑选了许多优秀的文章和设计指南后,我正在考虑PIMPL实施。
考虑以下 UART/串行端口示例:
// -----------------------------
// High-level HAL
// -----------------------------
// serialport.h
class SerialPortPrivate;
class SerialPort {
public:
SerialPort(uint8_t portNumber);
~SerialPort();
bool open();
void close();
void setBaudRate(uint32_t baudRate = 115200);
private:
SerialPortPrivate *_impl;
};
Run Code Online (Sandbox Code Playgroud)
// serialport_p.h
class SerialPort;
class SerialPortPrivate {
public:
SerialPortPrivate(uint8_t portNumber, SerialPort *parent) {
// Store the parent (q_ptr)
_parent = parent;
// Store the port number, this is used to access UART
// specific registers UART->D[portNumber] = …Run Code Online (Sandbox Code Playgroud) 我正在研究硬件抽象层。此 HAL 的目的是在 Linux 驱动程序和 MCU 驱动程序之间轻松切换。
我正在研究 SPI 接口。下面是HAL“打开”SPI接口的函数签名。
hal/spi.h
spi_handle_t spi_open(spi_port_t channel, spi_config_t config);
Run Code Online (Sandbox Code Playgroud)
spi_port_t :
spi_config_t :
所以在mcu/spi.c 中,我在某个时候有:
typedef spiBASE_t spi_channel_t;
typedef spiDAT1_t spi_config_t;
spi_handle_t spi_open(spi_channel_t channel, spi_config_t config) {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
对于linux/spi.c:
typedef uint32_t spi_channel_t;
typedef ChannelConfig_t spi_config_t;
spi_handle_t spi_open(spi_channel_t channel, spi_config_t config) {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
现在问题出在hal/spi.h 中,我需要定义什么是 spi_channel_t 和 spi_config_t。
有没有办法制作类似的东西(我知道用 extern 是不可能的,但为了解释问题......): …
这是来自SuperUser.com的欺骗.那边的人不够聪明或不愿意帮助我; 也许它比程序员问题更像程序员问题:
我有一个应用程序,可读取4(4)个鼠标的输入,这些鼠标除了内置触摸板外,还通过USB插入.这是Ubuntu的9.10没有问题:哈尔德注意到了新的设备和udev的是他们所谓的品牌新条目/dev/input/mouse4... mouse7.
我的应用程序作为普通用户应用运行./dev属于的文件root和其他任何人都无法读取.
我做了chmod a+r mouse?一次没有问题,但是每次重启时以及每次插入或接出dang啮齿动物时设备都来来去去.
有人可以告诉我一个脚本或其他东西来操纵,所以我chmod自动发生吗?
我是Spring JPA的新手.我有一个名为Product的模型.我正在尝试编写一个api终点来获取products表的最近记录.
public static interface Repository extends PagingAndSortingRepository<Product, Long>
{
List findTop2ByOrderByIdDesc();
}
Run Code Online (Sandbox Code Playgroud)
当我运行我的应用程序HAL浏览器 http:// localhost:8080/api/v1/products/search/findTop2ByOrderByIdDesc
我收到的错误是
{
"timestamp": 1440573947629,
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.IncorrectResultSizeDataAccessException",
"message": "result returns more than one elements; nested exception is javax.persistence.NonUniqueResultException: result returns more than one elements",
"path": "/api/v1/products/search/findTop2ByOrderByIdDesc"
}
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题.好心提醒
我正在学习在 HAL 中编程,今天我想将一些数据保存到外部 I2C EEPROM。问题是我发送地址后无法让EEPROM发送ACK。我使用 Arduino(在 5V 和 3V 上)进行了尝试,IC 以 ACK 响应。我尝试连接一个 MLX90614 I2C IR 传感器,它工作正常(我得到了响应,我可以在 Arduino 和 STM32 中发送和接收数据)。我还交换了 SDA 和 SCL 引线,认为我可能将它们混合在一起,但事实并非如此。我使用了一个逻辑分析仪,正如你所看到的,我只得到了一个 NACK。我不认为 EEPROM IC (ATMLU036/2EB - AT24C256B) 不喜欢 3V,因为它在 Arduino 中工作,数据表说它即使在较低电压下也能正常工作。我不知道为什么它不工作以及为什么其他 I2C 外围设备(例如 IR 传感器)工作得很好。我正在使用 STM32F429ZI - DISC1。这是我的代码:(简而言之,我将 PB8 引脚用于 SCL,PB9 用于 SDA,我尝试了 100kHz、10kHz、1kHz scl 频率,但没有帮助。在 STM32CubeMX 中我没有改变任何东西 - 线路有内部拉力上电阻)
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;
/* …Run Code Online (Sandbox Code Playgroud) 众所周知,Hal Lib 提供了一些回调函数来管理硬件中断。但我不知道它们是如何工作的?
事实上,我正在使用HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个函数来接收其他设备的数据并检查这些数据。所以我使用 usart 中断来接收它们。
但是不知道回调函数什么时候执行,是取决于接收缓冲区的长度还是数据的缓冲区?
我猜在接收到一个字符时会触发硬件中断,但是在接收缓冲区已满后会执行回调函数。
PS:本人使用stm32-nucleo-f410开发板与AT指令设备通信,本人新手。(很抱歉我的英语不好!)非常感谢。
我刚刚开始对 STM32 进行编程,并使用 CubeMX 生成了一个代码,用于与陀螺仪 (L3GD20) 进行 SPI 通信。我对 HAL_SPI 命令有疑问。
我首先尝试读取WHO_AM_I返回良好响应(0xD4)的寄存器,然后我尝试对寄存器执行相同的操作CTRL_REG1,返回(0x07)仍然很好。
但是,如果我尝试一个接一个地获取它们,则会HAL_SPI_Receive不断发送第一个代码的数据HAL_SPI_Transmit...尝试为其提供其他缓冲区,但仍然不起作用。
这是我感兴趣的代码部分:
uint8_t txData[8],rxData[8]; //Buffers for the first read.
uint8_t rBuffer[8]; //Buffer for the second read.
/*...............................................................
*...............................................................
*...............................................................
*/...............................................................
txData[0] = ADDR_WHO_AM_I | 0x80;
HAL_SPI_Transmit(&hspi2, txData, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi2, rxData, 1, HAL_MAX_DELAY); //Returns the right value
HAL_Delay(1000);
txData[0] = ADDR_CTRL_REG1 | 0x80;
HAL_Delay(500);
HAL_SPI_Transmit(&hspi2, txData, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi2, rBuffer, 1, HAL_MAX_DELAY); //Returns the same value...
HAL_Delay(1000);
Run Code Online (Sandbox Code Playgroud)
PS:我还想了解更多有关HAL_SPI_TransmitReceive如果可能的话,我应该如何使用它来执行相同的任务?(从不同的寄存器读取 …
在定义嵌入式系统架构时,在定义HAL时有两种选择 -
哪一个更好,为什么?