顯示具有 MCU 標籤的文章。 顯示所有文章
顯示具有 MCU 標籤的文章。 顯示所有文章

2023年7月25日 星期二

更高效處理 micro second 的方式

更高效處理 micro second 的方式… 

以 STM32 為例…

__IO unsigned long sys_tick = 0;

void SysTick_Handler(void)
{
    HAL_IncTick();
    sys_tick += (SysTick->LOAD + 1);
}

unsigned long  micros_ticks(void)
{
    unsigned long save_sys_tick;
    unsigned long st;

    do
    {
        save_sys_tick = sys_tick;
        st = SysTick->VAL;
    } while (save_sys_tick != sys_tick);
    return (save_sys_tick-st);
}

Get micro second...
micros = micros_ticks()/(SysTick->LOAD + 1) 
or just get ticks for saving cpu calculate time...
microsxconstant = micros_ticks()

*在只需計時的場合直接使用 micros_ticks,可以節省 CPU 運算除法的時間

2021年10月14日 星期四

One Source, Multi-MCUs

The global chip shortage has turned me into a multi-platform firmware developer.

Zero code modifications.

STM / MM32 / Nuvotone



2019年7月9日 星期二

NXP S9KEAZN64 Disable NMI


陷阱題:

KE 系列 MCU,PTB4 腳在 reset 後預設會使用 NMI 功能
導致無法當一般 GPIO 使用
因此要 Disable 掉
不然會 d 到天荒地老

在 system_SKEAZN642.c 中 void SystemInit (void) 函式 增加一行…
SIM->SOPT &= ~SIM_SOPT_NMIE_MASK;                //禁用NMI

2019年1月23日 星期三

Holtek 使用 HSI 的方式

Holtek 使用 HSI 的方式…

以 HT32f2220 為例
從 project_template 建立專案的話,修改底下 define …

在 system_ht32f5xxxx_02.c 中…
#define HSI_ENABLE        (1)     /*!< 0: DISABLE,  1: ENABLE                                               */
#define HSE_ENABLE        (0)     /*!< 0: DISABLE,  1: ENABLE                                               */
#define LSI_ENABLE        (1)     /*!< 0: DISABLE,  1: ENABLE                                               */
#define LSE_ENABLE        (0)     /*!< 0: DISABLE,  1: ENABLE                                               */
#define PLL_ENABLE        (1)     /*!< 0: DISABLE,  1: ENABLE                                               */
#define PLL_CLK_SRC       (1)     /*!< 0: HSE,      1: HSI                                                  */

再直接使用 example 中的 SysClockConfig_HSI() 函式進入 HIS 模式即可。

這樣 XTALIN、XTALOUT 就能拿來當 gpio 腳了。

2016年4月18日 星期一

這些年摸過的小玩意

記錄一下這些年摸過的小玩意…

RASPBERRY PI : 拿來開發較複雜的系統很好,Linux base 的核心基本上可以玩的東西就很多了,而且資源也很豐富。

Intel Galileo : 只稍微摸看看,基本上能玩的跟 PI 應該大同小意。

Arduino DUE : 32bit ARM 作出來的強化版 Arduino,可以開發 ADK( Android Open Accessory Development Kit) 不過現在都走無線的了吧?

Arduino UNO : 好用是無庸置疑的,拿來作快速開發,網路上還有一堆 lib 可以用。

TI MSP430 : Good

ESP2866 : 小型 wifi 嵌入式系統,腳位不多,可以拿來作 iot 之類的東西。

TI CC2541 : 藍牙模組,可以拿來作 iot 之類的東西,開發手機應用產品。

EN28j60 : 8bit 低階 MCU 上網功能,還算堪用,也因此學會了很多網路底層的東西。

STM32F030 : 便宜的 ARM,拿來當強化版的 8bit MCU 用。

Freescale FRDM KL-05 : 還 ok。

Freescale TWR-S12G128 : 還 ok。☆

Arduino W5100  Ethernet Shield : Arduino 要簡單上網就靠它了。

STM32 Demo Board : 拿來學習 ARM 的板子。

ST NUCLEO-F411RE : mbed 開發版。

STM32 Demo Board : 拿來學習 ARM 的板子。

還有其它數不清的小模組板…

2013年5月30日 星期四

ENC28J60+UIP1.0 TCI/IP Stack 接收 UDP 廣播封包

要讓 ENC28J60+UIP1.0 TCI/IP Stack 接收 UDP 廣播封包的方式…

一、UIP 修改 configure 檔 uip-conf.h
    #define UIP_CONF_BROADCAST            1

二、ENC28J60 的部份在設定 FILTER 時要禁用 FILTER。

不接收廣播訊息要設定如下,找到設置 FILTER 的程式碼,mark 掉才能聽廣播…

    //接收過濾器
    //UCEN:單播過濾器使能位
    //當ANDOR = 1 時:
    //1 = 目標地址與本地MAC 地址不匹配的數據包將被丟棄
    //0 = 禁止過濾器
    //當ANDOR = 0 時:
    //1 = 目標地址與本地MAC 地址匹配的數據包會被接受
    //0 = 禁止過濾器

    //CRCEN:後過濾器CRC 校驗使能位
    //1 = 所有CRC 無效的數據包都將被丟棄
    //0 = 不考慮CRC 是否有效
   
    //PMEN:格式匹配過濾器使能位
    //當ANDOR = 1 時:
    //1 = 數據包必須符合格式匹配條件,否則將被丟棄
    //0 = 禁止過濾器
    //當ANDOR = 0 時:
    //1 = 符合格式匹配條件的數據包將被接受
    //0 = 禁止過濾器
    enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);
    enc28j60Write(EPMM0, 0x3f);
    enc28j60Write(EPMM1, 0x30);
    enc28j60Write(EPMCSL, 0xf9);
    enc28j60Write(EPMCSH, 0xf7);


三、UIP 建立 Connection…
    uip_ipaddr_t ipaddr;  
    struct uip_udp_conn * conn;
   
    uip_ipaddr( ipaddr, 0, 0,0, 0 );
    conn = uip_udp_new( &ipaddr, HTONS( 0 ) );
    if( conn != NULL )
            uip_udp_bind( conn, HTONS( MY_UDP_PORT ) );

2011年6月20日 星期一

MIDI Code 在 Windows & Apple - Mac 的差別

同樣是 MIDI out 到 device,Windows 跟 Mac 卻有差別…

-----------------------------
差別一:
例如:一個 Note 「09 90 01 7f」,在 Windows 作輸出時,透過 Bus Hound (監視 USB 通訊的軟體) 來看是底下這樣…
Device  Length    Phase  Data         Description       Delta  Cmd.Phase.Ofs(rep)
------  --------  -----  -----------  ----------------  -----  ------------------
  27.4        64  OUT    09 90 01 7f  ....              5.1sc        28.1.0       
                         00 00 00 00  ....                           28.1.4       
                         00 00 00 00  ....                           28.1.8       
                         00 00 00 00  ....                           28.1.12      
                         00 00 00 00  ....                           28.1.16      
                         00 00 00 00  ....                           28.1.20      
                         00 00 00 00  ....                           28.1.24      
                         00 00 00 00  ....                           28.1.28      
                         00 00 00 00  ....                           28.1.32      
                         00 00 00 00  ....                           28.1.36      
                         00 00 00 00  ....                           28.1.40      
                         00 00 00 00  ....                           28.1.44      
                         00 00 00 00  ....                           28.1.48      
                         00 00 00 00  ....                           28.1.52      
                         00 00 00 00  ....                           28.1.56      
                         00 00 00 00  ....                           28.1.60      

Windows 一次「至少」就傳了 64 bytes 的資料給 device ,後面無用的資料都補 0。

但是 Mac 卻只有傳了…「09 90 01 7f」這 4 個 bytes,並且沒有 0 作結尾。

-----------------------------
差別二:
很多 MIDI Code 要傳輸時,Windows 都是遵照上述的原則,一定會傳出 64 bytes (或許有別的 MIDI API 可以作不一樣長度的輸出,但以音控軟體 Traktor 而言是如此)

但是 Mac 在這個情況下有可能會傳出 4*N 個 bytes,也就是 4、8、12、16…。

------------------------------------
於是在韌體的撰寫上就要特別注意這二個不同的差別來作 MIDI Code 的解析,才能同時相容於 Windows 及 Mac!!!

看起來 Mac 的效能會比較好。

2009年12月8日 星期二

紅外線發射程式

最近用微處理器(MCU)寫了個紅外線發射的程式…
原本的想法太過於複雜,程式寫久了會想要把東西寫的更靈活,於是會自己加了很多動態的計算、即時的判斷程式碼,沒想到對系統資源有限、時序要求非常嚴苛的 MCU 卻是一種負擔,這在多核的MCU如FPPA下不是什麼大問題,但在傳統的 MCU 如 EMC 或 PIC 卻會讓你越靈活就越難以控制(尤其是當你用C而不用組合語言來寫的時候)。
在重新思考及嘗試後才發現原來程式很簡單…

/// 這邊的編碼是以 SM5032 為例…
void IR_Bit0( void )
{
/// 產生1/4週期的38KHZ載波
}

void IR_Bit1( void )
{
/// 產生3/4週期的38KHZ載波
}

void IR_Empty( void )
{
/// 空周期延時
}

void IR_Head( void ){
      IR_Bit1();
      IR_Bit1();
      IR_Bit0();
}

void IR_Custom( void )
{
      IR_Bit1();
      IR_Bit1();
}

void IR_Tail( void )
{
      IR_Empty();
      IR_Empty();
      IR_Empty();
      IR_Empty();
}

#define _0 IR_Bit0();   
#define _1 IR_Bit1();
#define _H IR_Head();    /// HEAD code
#define _C IR_Custom();/// Custom code
#define _T IR_Tail(); /// End code
   
void main()
{
    Initial();
    Initial_IO();
   
    while(1)
    {
        if( BTN0 == 0 )
        {
            _H _C _0 _0 _0 _0 _0 _0 _1 _T                       
        } else if( BTN1 == 0 )
        {
            _H _C _0 _0 _0 _0 _0 _1 _0 _T     
        } else if( BTN2 == 0 )
        {
            _H _C _0 _0 _0 _1 _0 _0 _0 _T                       
        } else if( BTN3 == 0 )
        {
            _H _C _1 _0 _0 _0 _0 _1 _1 _T                       
        } else if( BTN4 == 0 )
        {
            _H _C _0 _0 _0 _0 _1 _0 _0 _T                       
        } else if( BTN5 == 0 )
        {
            _H _C _0 _0 _1 _0 _0 _0 _0 _T                       
        } else if( BTN6 == 0 )
        {
            _H _C _0 _1 _0 _0 _0 _0 _0 _T                       
        }
    }
}






另外有一點要特別注意,一般紅外線發射會使用455KHZ的晶振,算是比較低頻,各家 MCU 特性不同,有可能會需要在 OSCO 串上個串聯電組 (5-10K)才會正常起振。

VirtualBox 空間減肥

@windows vm sdelete64 -z c: @macos VBoxManage  modifymedium  disk  "/Users/fellow/VirtualBox VMs/Win10/Win10.vdi"  --compact *.vdi...