在编写硬件驱动程序时,我几乎是一个完全白痴,但是我在C/C++上相当不错.
我有一个有趣的项目,我想尝试使用设备作为网络系绳代理.
我想要做的是创建一个驱动程序,它似乎是Windows的网络驱动程序,但实际上通过连接到另一个设备的USB端口发送/接收.
我对需要实施的内容非常了解,但我不知道从哪里开始寻找研究信息.
有什么指针吗?
干杯...
我知道它代表硬件抽象层,但它究竟是做什么的?它是否设计用于VB等高级语言与硬件进行通信?那些IN/OUT指令如何调用HAL例程或者是否通过I/O管理器直接与硬件的设备驱动程序通信?
提前致谢
当我发送CMD0命令(0x40 0x00 0x00 0x00 0x00 0x95)时,我试图在STM32F303上使用SPI初始化SDCard,我试着看一下示波器上来自MOSI的信号,我看到了不同的信号,如下图所示.请注意,SPI速度为281.25kBits/s.任何帮助,将不胜感激.
以下是我用来测试MOSI输出的部分代码
uint8_t cmd0[6]={0x40,0x00,0x00,0x00,0x00,0x95};
FATFS_CS_HIGH;
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
for(int i=0;i<10;i++)
{
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
}
FATFS_CS_LOW;
while(1){
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[0], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[1], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[2], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[3], 1,10);
HAL_SPI_Transmit(&hspi1,(uint8_t *) cmd0[4], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[5], 1, 10);
}
Run Code Online (Sandbox Code Playgroud)
现在我发送正确的命令,我可以在范围内看到它.但是,我没有得到SD01的0x01响应(我一直得到0xff)(SanDisk Ultra 40MB/s ... 16GB)我使用下面的代码:
FATFS_CS_HIGH;
for (int i = 0; i < 10; i++) {
HAL_SPI_Transmit(&hspi1, &dumb, 1, 10);
while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
}
FATFS_CS_LOW; …Run Code Online (Sandbox Code Playgroud) 我有点困惑...
我有一个使用STM32 HAL库的嵌入式项目,该库又使用了stm32f072rb CMSIS头文件。
HAL 在这里声称它是严格的ANSI-C
The source code of drivers is developed in Strict ANSI-C, which makes it
independent from the development tools. It is checked with CodeSonarTM static
analysis tool. It is fully documented and is MISRA-C 2004 compliant.
Run Code Online (Sandbox Code Playgroud)
我相信严格的ANSI-C意味着C89,所以我将这些gcc标志添加到了我的Makefile中。
CFLAGS = -std=c89\
-pedantic-errors
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,会给出很多错误和警告。如果删除这些标志,它将进行编译。
我对此感到非常困惑。我是否缺少某些东西或他们的文档有误?
这是一些启用了该标志的gcc编译器错误...它们在许多STM32 HAL文件中不断重复。
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
error: unknown type name 'inline'
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'NVIC_GetPriority'
Run Code Online (Sandbox Code Playgroud) 我在 macOS 上开发 VoIP 应用程序,并使用 VoiceProcessingIO 音频单元进行音频处理,例如回声消除和自动增益控制。
问题是,当我初始化音频单元时,核心音频设备列表发生变化 - 不仅仅是添加 VP 音频单元满足其需要的新聚合设备,而且还因为内置输出设备(即“内置 - MacBook Pro”)扬声器”)现在也显示为输入设备,即除了输出流之外还有意外的输入流。
这是我在初始化 VP AU 之前从 Core Audio 获得的输入设备(又名“麦克风”)列表:
DEVICE: INPUT 45 BlackHole_UID
DEVICE: INPUT 93 BuiltInMicrophoneDevice
Run Code Online (Sandbox Code Playgroud)
这是我的 VP AU 初始化时的相同列表:
DEVICE: INPUT 45 BlackHole_UID
DEVICE: INPUT 93 BuiltInMicrophoneDevice
DEVICE: INPUT 86 BuiltInSpeakerDevice /// WHY?
DEVICE: INPUT 98 VPAUAggregateAudioDevice-0x101046040
Run Code Online (Sandbox Code Playgroud)
这是非常令人沮丧的,因为我需要在应用程序中显示设备列表,尽管我可以从设备列表中大胆地过滤掉聚合设备(无论如何它们都不能与 VP AU 一起使用),但我无法排除我们的内置 MacBook 扬声器设备。
也许你们中的某个人已经经历过这个并知道发生了什么以及是否可以解决这个问题。我需要注意一些 kAudioObjectPropertyXX 以从输入列表中排除设备。当然,这可能是苹果方面的一个错误/功能,我只需要想办法解决这个问题。
VP AU 运行良好,尽管使用了设备(我在内置和外部/USB/蓝牙等设备上尝试过),但问题仍然存在。该问题在我可以测试的所有 macOS 版本上都会重现,从 10.13 开始到 11.0 结束。这也会在不同的 Mac 和连接的不同音频设备组上重现。我很好奇,关于这个问题的可用信息几乎为零,这让我想到我做错了什么。
更奇怪的是,当 VP AU 工作时,HALLLab 应用程序指示另一件事:内置输入有两个以上的输入流(好吧,如果只是这样的话,我会幸存下来!)。但它并不表明内置输出已添加输入流,就像在我的应用程序中一样。
以下是有关如何设置 VP 音频单元的 …
我想在代码本身中获取闪存的限制地址,或者至少是该闪存的大小。
我在文件中只找到了flash的起始地址stm32f302xc.h,没有找到结束地址。
/** @addtogroup Peripheral_memory_map
* @{
*/
#define FLASH_BASE 0x08000000UL /*!< FLASH base address in the alias region */
#define SRAM_BASE 0x20000000UL /*!< SRAM base address in the alias region */
#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */
#define SRAM_BB_BASE 0x22000000UL /*!< SRAM base address in the bit-band region */
#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */
Run Code Online (Sandbox Code Playgroud)
是什么定义对此负责,谢谢。
在Apigility驱动的ZF2应用程序中,我想使用自定义Hydrator.
Module 类
class Module implements ApigilityProviderInterface {
...
public function getServiceConfig() {
return array(
'factories' => array(
...
'MyNamespace\\Hydrator\\ProjectHydrator' => function(ServiceManager $serviceManager) {
$projectHydrator = new ProjectHydrator();
$projectHydrator->setImageService($serviceManager->get('Portfolio\V2\Rest\ImageService'));
return $projectHydrator;
}
),
...
);
}
}
Run Code Online (Sandbox Code Playgroud)
module.config.php
...
'zf-hal' => array(
'metadata_map' => array(
...
'Portfolio\\V2\\Rest\\Project\\ProjectEntity' => array(
'entity_identifier_name' => 'id',
'route_name' => 'portfolio.rest.project',
'route_identifier_name' => 'id',
// 'hydrator' => 'Zend\\Stdlib\\Hydrator\\ClassMethods',
'hydrator' => 'MyNamespace\\Hydrator\\ProjectHydrator',
),
...
),
),
...
Run Code Online (Sandbox Code Playgroud)
当一个集合被检索时,它被忽略了,但它是另一个问题(s.here).当需要单个实体时,waterratin机制启动,但它不使用我的工厂,以创建实例.
经过一些调试后,我来到了ZF\Hal\Metadata\Metadata#setHydrator(...)代码中的这个地方:
if (is_string($hydrator)) …Run Code Online (Sandbox Code Playgroud) 我开始在 STM32F103xx MCU 中对 CAN 外设环回模式的 HAL 驱动程序进行基本使用。根据MCU的用户手册,当传输完全完成并且数据在CAN总线上可用时,CAN_TSR寄存器的TME、RQCP和TXOK位被硬件置1,表明相应的邮箱已变空,并且传输成功。
当我调试以下程序时,CAN_TSR 寄存器中没有发生上述任何更改。我只能看到 TME 位被设置,这意味着提供了一个邮箱用于传输,但从未传输。
我的这段代码导致程序中出现不定式循环:
while(HAL_CAN_IsTxMessagePending(&hcan, TxMailbox));
Run Code Online (Sandbox Code Playgroud)
您能解释一下我的问题是什么以及我应该做什么吗?感谢您的想法。
这是完整的代码:
#include "main.h"
CAN_HandleTypeDef hcan;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
/* USER CODE BEGIN PFP */
void Can_TX(void);
/* USER CODE END PFP */
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_CAN_Init();
/* USER CODE BEGIN 2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现单按、双按和长按功能来执行不同的功能。到目前为止,我已经理解了单按和长按的逻辑,但我不知道如何检测双按。至于代码,我已经使用计数器实现了单按和长按,但代码只停留在第一个 if 条件上。
bool single_press = false;
bool long_press = false;
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))
{
HAL_TIM_Base_Start(&htim2);
if ((TIM2->CNT == 20) && (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)))
{
single_press = true;
long_press = false;
}
else if ((TIM2->CNT == 799) && (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)))
{
single_press = true;
long_press = true;
}
HAL_TIM_Base_Stop(&htim2);
}
if (single_press == true && long_press == false)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 1);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 0);
}
else if (single_press == true && long_press == true)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 1);
HAL_Delay(1000); …Run Code Online (Sandbox Code Playgroud) 一些背景:我正在研究具有微控制器目标的嵌入式系统。我在这里的目的是澄清可用于代码存储库名称的术语。我专注于该文章中的低级命名,它对我来说代表面向目标的代码(而不是面向应用程序的高级代码)。
我在网络和论坛上循环,似乎没有人明确定义这些术语之间的区别:HAL、BSP 与驱动程序。
根据我的说法,我的所有三个术语在理论上都是等效的,但人们似乎会区分 HAL 是为 MCU 驱动程序(例如 UART、GPIO 等)保留的,而 BSP 是为外部外设驱动程序(例如加速度计)保留的、EEPROM、...)。
有人可以帮我澄清一下吗?此外,您能否提及您的答案是基于您的个人意见,还是基于社区/公司/标准/其他内容的推理/基本原理?
感谢您的时间,