這幾天看了下 mbed 的源碼,給上層應(yīng)用調(diào)用的接口封裝的還是不錯(cuò)的。代碼質(zhì)量比較高,注釋也很詳細(xì),文檔和例程比較全。但是驅(qū)動層的程序全是 C 語言編寫的,代碼質(zhì)量就沒有那么高了,注釋比較少而且不規(guī)范,比較懷疑 mbed 的穩(wěn)定性。mbed 的實(shí)時(shí)內(nèi)核是用的 RTX5 ,文件系統(tǒng)用的 FatFs ,還有一些開源的協(xié)議棧,整套系統(tǒng)比較繁雜。mbed 框架是為物聯(lián)網(wǎng)設(shè)備開發(fā)的,工業(yè)控制級別的產(chǎn)品可以考慮用 RTE 框架。RTE 框架目前驅(qū)動層程序還不太完善,有好多需要自己去實(shí)現(xiàn),可能在過一段時(shí)間會好一些吧。總之物聯(lián)網(wǎng)產(chǎn)品可以用 mbed ,工業(yè)控制產(chǎn)品可以用 RTE 。這幾天封裝了 EXTI ,距離整套系統(tǒng)可以產(chǎn)生生產(chǎn)力還有很長的距離要走,我也不知道整個(gè)系統(tǒng)會成什么樣子,我能堅(jiān)持多久,不管了先做再說。在這里分享我的 STM32F4 C++ 封裝之旅。今天分享《STM32F4 C++ 封裝庫 之 EXTI》,直接上代碼了~
stm32f4xx_xexti.h 文件
/**
******************************************************************************
* \file stm32f4xx_xexti.h
* \author XinLi
* \version v1.0
* \date 20-March-2018
* \brief Header file for external interrupt/event controller module.
******************************************************************************
* \attention
*
*
Copyright © 2018 XinLi
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
*
******************************************************************************
*/
#ifndef STM32F4XX_XEXTI_H
#define STM32F4XX_XEXTI_H
#include "stm32f4xx_ll_exti.h"
/*! External interrupt/event controller module. */
class XExti
{
public:
/*! Enumerate of EXTI lines. */
enum ExtiLine
{
Line0 = LL_EXTI_LINE_0, /*!< EXTI line 0. */
Line1 = LL_EXTI_LINE_1, /*!< EXTI line 1. */
Line2 = LL_EXTI_LINE_2, /*!< EXTI line 2. */
Line3 = LL_EXTI_LINE_3, /*!< EXTI line 3. */
Line4 = LL_EXTI_LINE_4, /*!< EXTI line 4. */
Line5 = LL_EXTI_LINE_5, /*!< EXTI line 5. */
Line6 = LL_EXTI_LINE_6, /*!< EXTI line 6. */
Line7 = LL_EXTI_LINE_7, /*!< EXTI line 7. */
Line8 = LL_EXTI_LINE_8, /*!< EXTI line 8. */
Line9 = LL_EXTI_LINE_9, /*!< EXTI line 9. */
Line10 = LL_EXTI_LINE_10, /*!< EXTI line 10. */
Line11 = LL_EXTI_LINE_11, /*!< EXTI line 11. */
Line12 = LL_EXTI_LINE_12, /*!< EXTI line 12. */
Line13 = LL_EXTI_LINE_13, /*!< EXTI line 13. */
Line14 = LL_EXTI_LINE_14, /*!< EXTI line 14. */
Line15 = LL_EXTI_LINE_15, /*!< EXTI line 15. */
#ifdef LL_EXTI_LINE_16
Line16 = LL_EXTI_LINE_16, /*!< EXTI line 16. */
#endif
#ifdef LL_EXTI_LINE_17
Line17 = LL_EXTI_LINE_17, /*!< EXTI line 17. */
#endif
#ifdef LL_EXTI_LINE_18
Line18 = LL_EXTI_LINE_18, /*!< EXTI line 18. */
#endif
#ifdef LL_EXTI_LINE_19
Line19 = LL_EXTI_LINE_19, /*!< EXTI line 19. */
#endif
#ifdef LL_EXTI_LINE_20
Line20 = LL_EXTI_LINE_20, /*!< EXTI line 20. */
#endif
#ifdef LL_EXTI_LINE_21
Line21 = LL_EXTI_LINE_21, /*!< EXTI line 21. */
#endif
#ifdef LL_EXTI_LINE_22
Line22 = LL_EXTI_LINE_22, /*!< EXTI line 22. */
#endif
#ifdef LL_EXTI_LINE_23
Line23 = LL_EXTI_LINE_23, /*!< EXTI line 23. */
#endif
#ifdef LL_EXTI_LINE_24
Line24 = LL_EXTI_LINE_24, /*!< EXTI line 24. */
#endif
#ifdef LL_EXTI_LINE_25
Line25 = LL_EXTI_LINE_25, /*!< EXTI line 25. */
#endif
#ifdef LL_EXTI_LINE_26
Line26 = LL_EXTI_LINE_26, /*!< EXTI line 26. */
#endif
#ifdef LL_EXTI_LINE_27
Line27 = LL_EXTI_LINE_27, /*!< EXTI line 27. */
#endif
#ifdef LL_EXTI_LINE_28
Line28 = LL_EXTI_LINE_28, /*!< EXTI line 28. */
#endif
#ifdef LL_EXTI_LINE_29
Line29 = LL_EXTI_LINE_29, /*!< EXTI line 29. */
#endif
#ifdef LL_EXTI_LINE_30
Line30 = LL_EXTI_LINE_30, /*!< EXTI line 30. */
#endif
#ifdef LL_EXTI_LINE_31
Line31 = LL_EXTI_LINE_31, /*!< EXTI line 31. */
#endif
};
/*! Enumerate of EXTI modes. */
enum ExtiMode
{
ModeInterrupt = LL_EXTI_MODE_IT, /*!< EXTI interrupt mode. */
ModeEvent = LL_EXTI_MODE_EVENT, /*!< EXTI event mode. */
ModeInterruptEvent = LL_EXTI_MODE_IT_EVENT, /*!< EXTI interrupt and event mode. */
};
/*! Enumerate of EXTI triggers. */
enum ExtiTrigger
{
TriggerNone = LL_EXTI_TRIGGER_NONE, /*!< EXTI none trigger. */
TriggerRising = LL_EXTI_TRIGGER_RISING, /*!< EXTI rising trigger. */
TriggerFalling = LL_EXTI_TRIGGER_FALLING, /*!< EXTI falling trigger. */
TriggerRisingFalling = LL_EXTI_TRIGGER_RISING_FALLING, /*!< EXTI rising and falling trigger. */
};
XExti(ExtiLine line, ExtiMode mode, ExtiTrigger trigger = TriggerNone);
virtual ~XExti();
void setLine(ExtiLine line);
ExtiLine getLine() const;
void setMode(ExtiMode mode);
ExtiMode getMode() const;
void setTrigger(ExtiTrigger trigger);
ExtiTrigger getTrigger() const;
void setFlag();
void clearFlag();
bool isFlagSet() const;
bool open();
void close();
bool isOpen() const;
private:
ExtiLine line;
ExtiMode mode;
ExtiTrigger trigger;
bool openFlag;
XExti(const XExti &) = delete;
XExti & operator = (const XExti &) = delete;
};
#endif // STM32F4XX_XEXTI_H
stm32f4xx_xexti.cpp 文件
/**
******************************************************************************
* \file stm32f4xx_xexti.cpp
* \author XinLi
* \version v1.0
* \date 20-March-2018
* \brief External interrupt/event controller module driver.
******************************************************************************
* \attention
*
*
Copyright © 2018 XinLi
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
*
******************************************************************************
*/
#include "stm32f4xx_xexti.h"
static __IO uint32_t extiOpenFlag = 0;
/*!
\brief Set external interrupt/event line flags.
\param line: EXTI line.
*/
static void SetExtiLineFlag(XExti::ExtiLine line)
{
extiOpenFlag |= line;
}
/*!
\brief Clear external interrupt/event line flags.
\param line: EXTI line.
*/
static void ClearExtiLineFlag(XExti::ExtiLine line)
{
extiOpenFlag &= ~line;
}
/*!
\brief Is an external interrupt/event line flag set?
\param line: EXTI line.
\retval true: External interrupt/event line flag is set.
\retval false: External interrupt/event line flag is not set.
*/
static bool IsExtiLineFlagSet(XExti::ExtiLine line)
{
return ((extiOpenFlag & line) == line);
}
/*!
\brief External interrupt/event controller module constructor.
\param line: EXTI line.
\param mode: EXTI mode.
\param trigger: EXTI trigger.
*/
XExti::XExti(ExtiLine line, ExtiMode mode, ExtiTrigger trigger)
{
this->line = line;
this->mode = mode;
this->trigger = trigger;
this->openFlag = false;
}
/*!
\brief External interrupt/event controller module destructor.
\details Restores the external interrupt/event controller to its default state.
*/
XExti::~XExti()
{
close();
}
/*!
\brief Set external interrupt/event line.
\param line: EXTI line.
*/
void XExti::setLine(ExtiLine line)
{
if(openFlag != true)
{
this->line = line;
}
}
/*!
\brief Get external interrupt/event line.
\return EXTI line.
*/
XExti::ExtiLine XExti::getLine() const
{
return line;
}
/*!
\brief Set external interrupt/event mode.
\param mode: EXTI mode.
*/
void XExti::setMode(ExtiMode mode)
{
this->mode = mode;
if(openFlag == true)
{
if(mode == ModeInterrupt)
{
LL_EXTI_DisableEvent_0_31(line);
LL_EXTI_EnableIT_0_31(line);
}
else if(mode == ModeEvent)
{
LL_EXTI_DisableIT_0_31(line);
LL_EXTI_EnableEvent_0_31(line);
}
else
{
LL_EXTI_EnableIT_0_31(line);
LL_EXTI_EnableEvent_0_31(line);
}
}
}
/*!
\brief Get external interrupt/event mode.
\return EXTI mode.
*/
XExti::ExtiMode XExti::getMode() const
{
return mode;
}
/*!
\brief Set external interrupt/event trigger.
\param trigger: EXTI trigger.
*/
void XExti::setTrigger(ExtiTrigger trigger)
{
this->trigger = trigger;
if(openFlag == true)
{
if(trigger == TriggerNone)
{
LL_EXTI_DisableRisingTrig_0_31(line);
LL_EXTI_DisableFallingTrig_0_31(line);
}
else if(trigger == TriggerRising)
{
LL_EXTI_DisableFallingTrig_0_31(line);
LL_EXTI_EnableRisingTrig_0_31(line);
}
else if(trigger == TriggerFalling)
{
LL_EXTI_DisableRisingTrig_0_31(line);
LL_EXTI_EnableFallingTrig_0_31(line);
}
else
{
LL_EXTI_EnableRisingTrig_0_31(line);
LL_EXTI_EnableFallingTrig_0_31(line);
}
}
}
/*!
\brief Get external interrupt/event trigger.
\return EXTI trigger.
*/
XExti::ExtiTrigger XExti::getTrigger() const
{
return trigger;
}
/*!
\brief Set external interrupt/event flags.
*/
void XExti::setFlag()
{
if(openFlag == true)
{
LL_EXTI_GenerateSWI_0_31(line);
}
}
/*!
\brief Clear external interrupt/event flags.
*/
void XExti::clearFlag()
{
if(openFlag == true)
{
LL_EXTI_ClearFlag_0_31(line);
}
}
/*!
\brief Is an external interrupt/event flag set?
\retval true: External interrupt/event flag is set.
\retval false: External interrupt/event flag is not set.
*/
bool XExti::isFlagSet() const
{
if(openFlag == true)
{
return LL_EXTI_IsActiveFlag_0_31(line);
}
else
{
return false;
}
}
/*!
\brief Open external interrupt/event line.
\retval true: External interrupt/event line open success.
\retval false: External interrupt/event line open failure.
*/
bool XExti::open()
{
if(IsExtiLineFlagSet(line) != true)
{
if(mode == ModeInterrupt)
{
LL_EXTI_DisableEvent_0_31(line);
LL_EXTI_EnableIT_0_31(line);
}
else if(mode == ModeEvent)
{
LL_EXTI_DisableIT_0_31(line);
LL_EXTI_EnableEvent_0_31(line);
}
else
{
LL_EXTI_EnableIT_0_31(line);
LL_EXTI_EnableEvent_0_31(line);
}
if(trigger == TriggerNone)
{
LL_EXTI_DisableRisingTrig_0_31(line);
LL_EXTI_DisableFallingTrig_0_31(line);
}
else if(trigger == TriggerRising)
{
LL_EXTI_DisableFallingTrig_0_31(line);
LL_EXTI_EnableRisingTrig_0_31(line);
}
else if(trigger == TriggerFalling)
{
LL_EXTI_DisableRisingTrig_0_31(line);
LL_EXTI_EnableFallingTrig_0_31(line);
}
else
{
LL_EXTI_EnableRisingTrig_0_31(line);
LL_EXTI_EnableFallingTrig_0_31(line);
}
SetExtiLineFlag(line);
openFlag = true;
return true;
}
else
{
return false;
}
}
/*!
\brief Close external interrupt/event line.
\details Restores the external interrupt/event controller to its default state.
*/
void XExti::close()
{
if(openFlag == true)
{
LL_EXTI_DisableIT_0_31(line);
LL_EXTI_DisableEvent_0_31(line);
LL_EXTI_DisableRisingTrig_0_31(line);
LL_EXTI_DisableFallingTrig_0_31(line);
LL_EXTI_ClearFlag_0_31(line);
ClearExtiLineFlag(line);
openFlag = false;
}
}
/*!
\brief Is the external interrupt/event line open?
\retval true: External interrupt/event line is open.
\retval false: External interrupt/event line is not open.
*/
bool XExti::isOpen() const
{
return openFlag;
}
例程
/**
******************************************************************************
* @file main.cpp
* @author XinLi
* @version v1.0
* @date 20-March-2018
* @brief Main program body.
******************************************************************************
* @attention
*
*
Copyright © 2018 XinLi
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
*
******************************************************************************
*/
/* Header includes -----------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_xgpio.h"
#include "stm32f4xx_xexti.h"
/* Macro definitions ---------------------------------------------------------*/
/* Type definitions ----------------------------------------------------------*/
/* Variable declarations -----------------------------------------------------*/
/* Variable definitions ------------------------------------------------------*/
/* Function declarations -----------------------------------------------------*/
static void SystemClock_Config(void);
/* Function definitions ------------------------------------------------------*/
/**
* @brief Main program.
* @param None.
* @return None.
*/
int main(void)
{
/* STM32F4xx HAL library initialization:
- Configure the Flash prefetch, instruction and Data caches
- Configure the Systick to generate an interrupt each 1 msec
- Set NVIC Group Priority to 4
- Global MSP (MCU Support Package) initialization
*/
HAL_Init();
/* Configure the system clock to 168 MHz */
SystemClock_Config();
XExti exti4(XExti::Line4, XExti::ModeInterrupt);
exti4.open();
XGpio led0(XGpio::PortF, XGpio::Pin9, XGpio::ModeOutput);
XGpio led1(XGpio::PortF, XGpio::Pin10, XGpio::ModeOutput);
led0.open();
led1.open();
for(;;)
{
if(exti4.isFlagSet() != true)
{
exti4.setFlag();
led0.setLevel(XGpio::LevelLow);
led1.setLevel(XGpio::LevelHigh);
}
else
{
exti4.clearFlag();
led0.setLevel(XGpio::LevelHigh);
led1.setLevel(XGpio::LevelLow);
}
HAL_Delay(250);
}
}
/**
* @brief System Clock Configuration
* The system Clock is configured as follow :
* System Clock source = PLL (HSE)
* SYSCLK(Hz) = 168000000
* HCLK(Hz) = 168000000
* AHB Prescaler = 1
* APB1 Prescaler = 4
* APB2 Prescaler = 2
* HSE Frequency(Hz) = 8000000
* PLL_M = 8
* PLL_N = 336
* PLL_P = 2
* PLL_Q = 7
* VDD(V) = 3.3
* Main regulator output voltage = Scale1 mode
* Flash Latency(WS) = 5
* @param None
* @retval None
*/
static void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet. */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/* Enable HSE Oscillator and activate PLL with HSE as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
/* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported */
if (HAL_GetREVID() == 0x1001)
{
/* Enable the Flash prefetch */
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
}
}
上一篇:ARM CMSIS Driver 學(xué)習(xí) 之 USART
下一篇:STM32F4 C++ 封裝庫 之 GPIO
推薦閱讀
史海拾趣
ACL Staticide是一家專業(yè)生產(chǎn)靜電控制產(chǎn)品的公司,以下是該公司發(fā)展的五個(gè)相關(guān)故事:
公司成立和起步階段: ACL Staticide成立于1971年,總部位于美國伊利諾伊州,是一家專注于靜電控制產(chǎn)品的制造商。公司最初致力于研發(fā)和生產(chǎn)靜電消除劑、清潔劑和防靜電地板涂層等產(chǎn)品,用于解決靜電問題帶來的種種困擾,如靜電放電、靜電積聚等。
技術(shù)創(chuàng)新和產(chǎn)品拓展: 隨著市場對靜電控制需求的增長,ACL Staticide不斷進(jìn)行技術(shù)創(chuàng)新,并拓展了產(chǎn)品線。公司推出了一系列靜電控制產(chǎn)品,包括靜電消除器、清潔劑、防靜電地板涂層、靜電測試儀器等,以滿足各種不同行業(yè)的需求。
市場拓展和國際合作: ACL Staticide積極開拓國內(nèi)外市場,與全球各地的客戶建立了合作關(guān)系。公司的產(chǎn)品被廣泛應(yīng)用于電子制造、半導(dǎo)體、醫(yī)療、航空航天、汽車等領(lǐng)域,贏得了客戶的信賴。同時(shí),ACL Staticide與國際知名企業(yè)合作,共同推動靜電控制技術(shù)的發(fā)展。
持續(xù)投入研發(fā)和質(zhì)量控制: ACL Staticide不斷加大研發(fā)投入,致力于產(chǎn)品質(zhì)量和技術(shù)創(chuàng)新。公司設(shè)立了專門的研發(fā)團(tuán)隊(duì)和實(shí)驗(yàn)室,不斷改進(jìn)現(xiàn)有產(chǎn)品,并開發(fā)新的靜電控制解決方案,以滿足客戶不斷變化的需求。
未來發(fā)展展望: ACL Staticide將繼續(xù)致力于靜電控制產(chǎn)品的研發(fā)和應(yīng)用,不斷推出更先進(jìn)、更可靠的產(chǎn)品和解決方案,以滿足客戶在各個(gè)領(lǐng)域的需求。公司將加強(qiáng)國際市場拓展,提升自身在全球市場的競爭力,為行業(yè)的發(fā)展做出更大的貢獻(xiàn)。
在競爭激烈的電子行業(yè)中,合作共贏是企業(yè)發(fā)展的重要途徑。Diodes公司始終堅(jiān)持合作共贏的理念,與眾多上下游企業(yè)建立了緊密的合作關(guān)系。例如,在供應(yīng)鏈方面,Diodes與多家原材料供應(yīng)商建立了長期穩(wěn)定的合作關(guān)系,確保原材料的穩(wěn)定供應(yīng)和質(zhì)量保障;在銷售方面,Diodes與多家分銷商建立了戰(zhàn)略合作伙伴關(guān)系,共同開拓市場、推廣產(chǎn)品。這些合作關(guān)系不僅為Diodes帶來了更多的商業(yè)機(jī)會和市場份額,也促進(jìn)了整個(gè)產(chǎn)業(yè)鏈的健康發(fā)展。
在電子行業(yè)的早期,Cretex Companies Inc.憑借對半導(dǎo)體技術(shù)的深入研究和創(chuàng)新,迅速嶄露頭角。公司研發(fā)出一款具有高效能、低功耗特點(diǎn)的芯片,這一技術(shù)突破使得電子設(shè)備的性能大幅提升,同時(shí)降低了能耗。憑借這一優(yōu)勢,Cretex的產(chǎn)品在市場上獲得了廣泛認(rèn)可,公司規(guī)模逐漸擴(kuò)大。
為了進(jìn)一步擴(kuò)大市場份額,町洋開始進(jìn)軍國際市場。公司憑借其優(yōu)質(zhì)的產(chǎn)品和服務(wù),逐漸在歐美等發(fā)達(dá)國家和地區(qū)打開了市場。為了更好地服務(wù)全球客戶,町洋在全球設(shè)立了多個(gè)貿(mào)易與服務(wù)機(jī)構(gòu),構(gòu)建了完善的銷售網(wǎng)絡(luò)和售后服務(wù)體系。
隨著全球環(huán)保意識的日益增強(qiáng),ATO SOLUTION公司積極響應(yīng)綠色環(huán)保號召,將環(huán)保理念融入企業(yè)發(fā)展和產(chǎn)品生產(chǎn)中。公司采用環(huán)保材料和工藝,減少生產(chǎn)過程中的污染排放;同時(shí),還加大了對可再生能源的利用和節(jié)能技術(shù)的研發(fā),努力實(shí)現(xiàn)企業(yè)的綠色可持續(xù)發(fā)展。這種環(huán)保實(shí)踐不僅提升了公司的社會形象,也為公司的長期發(fā)展注入了新的動力。
這些故事框架都是基于電子行業(yè)發(fā)展的普遍趨勢和可能情況構(gòu)建的,您可以根據(jù)ATO SOLUTION公司的實(shí)際情況進(jìn)行調(diào)整和補(bǔ)充。在撰寫具體故事時(shí),請確保內(nèi)容的真實(shí)性和客觀性,避免加入主觀評價(jià)或猜測。
Hendon Semiconductors在能源管理和照明控制領(lǐng)域也有著顯著的成就。公司開發(fā)了一系列高效、可靠的能源管理解決方案和照明控制產(chǎn)品,廣泛應(yīng)用于智能家居、商業(yè)建筑和工業(yè)自動化等領(lǐng)域。這些解決方案不僅幫助客戶降低了能耗和運(yùn)營成本,還提高了能源使用效率和環(huán)境可持續(xù)性。通過不斷創(chuàng)新和優(yōu)化產(chǎn)品設(shè)計(jì),Hendon Semiconductors在能源管理和照明控制市場上贏得了廣泛的認(rèn)可。
嵌入式系統(tǒng)的核心是嵌入式微處理器。嵌入式微處理器一般就具備以下4個(gè)特點(diǎn): 1)對實(shí)時(shí)多任務(wù)有很強(qiáng)的支持能力,能完成多任務(wù)并且有較短的中斷響應(yīng)時(shí)間,從而使內(nèi)部的代碼和實(shí)時(shí)內(nèi)核心的執(zhí)行時(shí)間減少到最低限度。 2)具有功能很強(qiáng)的存儲區(qū)保護(hù) ...… 查看全部問答∨ |
|
前言 人生約有三分之一的時(shí)間在睡眠中度過,良好的睡眠是保證身體健康的必要條件。睡眠呼吸暫停癥(sleep apnea)是一種很常見的睡眠呼吸疾病,據(jù)調(diào)查,在美國約有24%的成年男性及9%成年女 ...… 查看全部問答∨ |
|
以太網(wǎng)控制器KSZ8851, ping timeout的問題 實(shí)驗(yàn)板使用KSZ8851-16MLL以太網(wǎng)控制器 使用PC連續(xù)ping實(shí)驗(yàn)板直到timeout,當(dāng)ping 153次、384次或者537次后,timeout; 我測試了20組,ping 153次后timeout出現(xiàn)了9次,384后出現(xiàn)7次,537出現(xiàn)4次。 這個(gè)似乎太規(guī)律了吧? TCP/IP協(xié)議棧問題不大, ...… 查看全部問答∨ |
請高手幫忙: 問下tornado的安裝過程中,如果從開始菜單直接運(yùn)行tornado,會提示錯(cuò)誤,這是因?yàn)榘惭b還沒有完成,在C盤Tornado2.2文件夾下你會發(fā)現(xiàn)一個(gè)setup.log文件,用ultraedit或vim打開,在最后一行你會發(fā)現(xiàn)一個(gè)注冊表鍵值,進(jìn)入注冊表,找到這 ...… 查看全部問答∨ |
我想問一下,單片機(jī)項(xiàng)目開發(fā),是從硬件開始,然后是軟件,比如我做一個(gè)簡單的流水燈試驗(yàn),要買哪些零件啊,并且如何焊接啊, 如何設(shè)計(jì)原理圖啊,我真的不知道從何下手,高手教教我啊,謝謝了… 查看全部問答∨ |
s3c2410的板子 IICCON=IICCON_ACKEN|IICCON_CLK512|IICCON_INTR|IICCON_CLKPRE(0x3) 這條設(shè)置的波特率是多少?有誰知道嗎? 還有若要設(shè)置成9600bps應(yīng)該如何修改?… 查看全部問答∨ |
我最近在PDA上調(diào)WIFI睡眠喚醒,硬件上有兩個(gè)GPIO口可以控制芯片電流,是高使能,WIFI正常工作時(shí)要置為高,現(xiàn)在我在睡眠時(shí)在驅(qū)動中將其置低,在喚醒時(shí)將其拉高。我想問的是,喚醒時(shí),我還需要做些什么配置,才能使WIFI能正常工作?請高手指點(diǎn)! … 查看全部問答∨ |
終于要用430作實(shí)用儀器了,有幾個(gè)問題困惑著我。 1. 以前都是用最小系統(tǒng)版,現(xiàn)在只有一個(gè)MCU轉(zhuǎn)接版,那是不是要用導(dǎo)線自己連接個(gè)最小系統(tǒng)? 2. 如何把程序燒進(jìn)板子,我只用過UIF。可是看到有好多種方法,哪位老機(jī)友給介紹一下,謝謝~ 3. 單片機(jī)的數(shù)字地和模擬地隔離的問題 4. 用4節(jié)1.5V電池供電 ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 基于HW2181B的航模無線遙控通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 應(yīng)對機(jī)器人“四高”,極海推出全球首款雙核Cortex-M52 MCU G32R501
- 非道路移動機(jī)械透射式煙度計(jì)研究與實(shí)現(xiàn)
- 基于STM32F103的角磨機(jī)開關(guān)磁阻電機(jī)控制器的設(shè)計(jì)
- 基于Cortex-M0智能水溫監(jiān)控系統(tǒng)的優(yōu)化
- STM32 printf重定向(串口輸出)
- 基于STM32H743的仿真轉(zhuǎn)臺控制器設(shè)計(jì)
- 電池新國標(biāo),帶來漲價(jià)潮?
- 2025Q1全球動力電池戰(zhàn)報(bào):中國6企占近7成份額,三星SDI裝機(jī)量跌17%
- 國產(chǎn)HUD頭部企業(yè)沖刺港股:背靠蔚來、小米、理想,3年?duì)I收翻倍
- 新能源重卡的智能化核心在哪里?
- 大圓柱電池,卷土重來
- 智駕暗戰(zhàn):全民智駕降溫,L3如箭在弦|上海車展觀察
- 蔡司智能玻璃技術(shù):車窗變娛樂屏,12000尼特亮度革新駕駛體驗(yàn)
- 車輛連接的衛(wèi)星之戰(zhàn)
- 兩款熱門 SUV 輔助駕駛大PK,更安全的秘訣是國產(chǎn)芯片?
- 麻省理工學(xué)院開發(fā)出可高速精準(zhǔn)回?fù)舻钠古仪驒C(jī)器人
- 【直播】恩智浦Thread/BLE雙模技術(shù)講座
- 文曄科技有獎(jiǎng)直播:C2000在電機(jī)控制中的應(yīng)用 等你來看!
- 泰克70周年慶 了解新品 參與掀蓋有禮活動 最多可獲得6次抽獎(jiǎng)機(jī)會
- 【EEWORLD第六屆社區(qū)明星人物】8月明星人物
- 直播已結(jié)束【使用 TI 低成本 MSPM0 MCU 快速開發(fā) – 生態(tài)詳解系列之二】(9:45開始入場)
- 新春尋寶記,泰克送福利!快來開啟你的尋寶之旅~
- 有獎(jiǎng)直播:借助Maxim的模擬技術(shù)優(yōu)化設(shè)計(jì)
- 有獎(jiǎng)評測:50套來自恩智浦全新快速物聯(lián)網(wǎng)原型設(shè)計(jì)套件(價(jià)值350元)
- DEYISUPPORT TI 大咖級工程師在這里,等你來約!
- 重磅!Geek+獲評全球Top50機(jī)器人公司 斬獲RBR50榜單
- 羅永浩明確:錘子科技還將繼續(xù)做手機(jī)
- 西數(shù)推一張售價(jià)可媲美驍龍855手機(jī)的TF卡,容量1TB
- 蘋果正自主研發(fā)5G芯片 推出恐到2025年?
- 微軟新專利:專為殘疾人設(shè)計(jì)的輸入設(shè)備?
- AR眼鏡聲聲慢,五大科技巨擘力筑AR價(jià)值鏈
- 中科大量子計(jì)算新進(jìn)展:實(shí)現(xiàn)三量子點(diǎn)半導(dǎo)體比特高效調(diào)控
- 中芯國際獨(dú)董William Tudor Brown沽清其44.92萬股
- 三星半導(dǎo)體銷售將登頂 英特爾失去連25年龍頭機(jī)會
- 瑞薩組織改造重新出發(fā) 轉(zhuǎn)守為攻進(jìn)軍車用平臺