Search

2014年12月28日 星期日

JLINK ARM-OB STM32F103C8T6 (DIP)

    說來也蠢,之前就想做STM32的debugger,我慣用的是STLINK + ST-UTIL + ARM-GDB,所以習慣上我還是比較常用discovery上的STLINK/V2,前陣子在網路看到一個叫JLINK的東西以為也可以用ST-Tools,結果直到昨天做了才知道這只能用SEGGER-Tools XDDDDD,還好本來SMD版本要送去淘寶給人洗板不過做了DIP版就發現XD,但是其實也還不錯用拉只是我不習慣而已,將firmware由SWD寫進後用JLINK-Commander可以將firmware升級,要注意的是輸出入的電壓都是3.3v!











Download:

MC34063 DC/DC - IV-18 Power Supply

    前陣子想說來完成IV-18 Clock送人(話說三四年前會做IN-16 Clock也是送人),所以先從IV-18的驅動電源開始,IV-18看網路的datasheet要40v才能驅動,不過之前在口丁聽到隨手小記的主人說只要30v便可驅動,因此找了MC34063弄了一個實際測試輸入5v輸出可調整約20v-40v的DC/DC,只要將升壓後的電源接至VFD驅動IC如MAX6921的VBB就可以了。

VCC輸入5v而VSS為輸出,兩個VR可調整。







Download:

2014年7月8日 星期二

Arduino WDT ISR

  用AVR C Library有wdt_enable & wdt_disable這兩個Function,他們會用cli清除中斷Flag,所以timer0會被影響因此delay在註冊的WDT ISR會失效只要記得在裡面用sei即可,WDTCSR暫存器除了Set WDE Flag外也要Set WDIE Flag才會在Intterup時進行中斷Jmp到註冊的ISR,若只有Set WDE intterup時會直接Reset,Reference Page54~56 & Table 10-1

wdt_enable:

#define wdt_enable (value)
__asm__ __volatile__ (  \
        "in __tmp_reg__,__SREG__" "\n\t"    \
        "cli" "\n\t"    \
        "wdr" "\n\t"    \
        "out %0,%1" "\n\t"  \
        "out __SREG__,__tmp_reg__" "\n\t"   \
        "out %0,%2" \
        : /* no outputs */  \
        : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
        "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)),   \
        "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
            _BV(WDE) | (value & 0x07)) ) \
        : "r0"  \
    )

wdt_disable:


#define wdt_disable ()
__asm__ __volatile__ (  \
    "in __tmp_reg__, __SREG__" "\n\t" \
     "cli" "\n\t" \
    "out %0, %1" "\n\t" \
    "out %0, __zero_reg__" "\n\t" \
    "out __SREG__,__tmp_reg__" "\n\t" \
    : /* no outputs */ \
    : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
    "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))) \
    : "r0" \
)

wdt_reset:

#define wdt_reset ()  __asm__ __volatile__ ("wdr")


2014年7月2日 星期三

久久一更新

  最近在學校試著弄個讀書會,因為要用到Arduino沒有DIP的ATMega328,所以只好做一個類似Arduino Mini Pro的板子,不過沒有LDO以及板子比Arduino Mini Pro大一點,唯一的優點是可以用單面板就洗出來。




SV8從5到1為GND,VCC,RX,TX,DTR。
SV1從6到1為A5~A0。
SV7從1到12為D2~D13。
LED2是電源LED1是D13測試用。





Downdload:




2014年5月18日 星期日

STM32F10X Nano v0.0.1

    最近比較有空上來更新一下blog,前陣子都在弄STM32的東西,所以為了方便畫了一個可以直接插上麵包板的實驗板,能相容STM32F100C8T6的IC應該都可以直接用,我用STM32F103C8T6也可以,當然load file不同而已,附上一個example測試PA0 weak up與PC13 led,我自己在使用都是用USART1去Upload程式,這個唯一的優點大概就是電路板可以用單面感光PCB做出來比較簡單,未來有時間會弄個jlink換SWD,然後再寫個GUI版的USART & SWD Upload程式。


Part List:

  • IC1:STM32F10X
  • U1:AMS-1117 3.3V
  • U2:8MHz Crystall
  • C1~C7:0.1uF
  • C8~C9:22pF
  • R1:1k ohm
  • R2~R3:10k ohm
  • L1~L2:電源與PC13 LED
  • B1~B2:Reset與PA0 weak up
  • JP1~JP3:GPIO與BOOT選擇



    JP3中間那支腳是B00T0,可與上下HIGH & LOW短路,JP1從最右邊數過來分別是5V、3.3V、GND,JP1最左邊是PA0一直到PB11,JP2最右邊開始則是PB12到PB9,都只有GPIO,PC13預留實驗用LED,PC14、15也預留可以焊音叉式Crystal。








Eaxmple:

#include "stm32f10x.h"
#include "stdio.h"

volatile uint32_t delay = 0;

void USART1_Send_Sting(char *string){
    while(*string){
        USART_SendData(USART1, (unsigned short int) *string++);

        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    }
}


void Init_WU()
{
  GPIO_InitTypeDef GPIO_InitStruct;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void Init_UART(){
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef interrup;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);

    USART_Cmd(USART1, ENABLE);

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

   interrup.NVIC_IRQChannel = USART1_IRQn;
   interrup.NVIC_IRQChannelPreemptionPriority = 0;
   interrup.NVIC_IRQChannelSubPriority = 0;
   interrup.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&interrup);

   NVIC_EnableIRQ(USART1_IRQn);
}

void Init_BT(void){
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef interrup;

    RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB1Periph_USART2, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);



    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART2, &USART_InitStructure);

    USART_Cmd(USART2, ENABLE);

    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

   interrup.NVIC_IRQChannel = USART2_IRQn;
   interrup.NVIC_IRQChannelPreemptionPriority = 0;
   interrup.NVIC_IRQChannelSubPriority = 0;
   interrup.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&interrup);

   NVIC_EnableIRQ(USART2_IRQn);
}

void BT_Send_String(volatile char *string)
{
   while(*string){
      USART_SendData(USART2,*string);
      ++string;
      while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET){}
   }
}

void PWR_StandbyMode( void )
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  PWR_WakeUpPinCmd(ENABLE);
  PWR_BackupAccessCmd(ENABLE);
  PWR_ClearFlag(PWR_FLAG_SB);
  PWR_EnterSTANDBYMode();
}

void Init_Default_Led(void)
{
   GPIO_InitTypeDef led;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);


   led.GPIO_Pin = GPIO_Pin_13;
   led.GPIO_Mode = GPIO_Mode_Out_PP;
   led.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init(GPIOC,&led);

}

void Delay(volatile uint32_t n)
{
   delay = n;
   while(delay != 0);
}


int main(){
    Init_UART();
    Init_BT();
    Init_Default_Led();
    Init_WU();

    SystemInit();
    if(SysTick_Config(SystemCoreClock / 1000)){
       while(1);
    }

    char str[256];
    sprintf(str,"\n\nFlash Size : %dKb\nUID : %X%X%X\n",*(volatile u16*)(0x1FFFF7E0),
 *(volatile u32*)(0x1FFFF7E8),*(volatile u32*)(0x1FFFF7EC),*(volatile u32*)(0x1FFFF7F0));
    USART1_Send_Sting(str);
    BT_Send_String(str);

    while(1){
       GPIO_SetBits(GPIOC,GPIO_Pin_13);
       Delay(1000);
       GPIO_ResetBits(GPIOC,GPIO_Pin_13);

       PWR_StandbyMode();
    }
}

void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){

      char c = USART1->DR/*USART_ReciveData(USART1)*/;

      USART_SendData(USART1,c);
   }
}

void USART2_IRQHandler(void)
{
   if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET){

      char c = USART2->DR/*USART_ReciveData(USART2)*/;

      USART_SendData(USART2,c);
   }
}

void SysTick_Handler(void)
{
   if(delay != 0){
      delay--;
   }
}











2014年3月29日 星期六

STM32 Remap & Linker Script

    STM32有幾個I/O啟動預設是JTAG & SWD,如果要當一般的GPIO用要通過Remap的方式映射功能,最重要的是要先啟動RCC再Remap順序反過來當然會失敗。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

    幾個我常用的STM32 Chip的Linker Script,Startup File Library找跟Chip同系列的link就可以了。


    最近又開始研究STM32F1系列,測試了大多數功能後最近有時間可以layout幾片類似Arduino Nano的板子來用,還有弄ARM-OB才可以用SWD。




2014年2月22日 星期六

Ardutester


  上禮拜在FB社團看到一個很酷的project = > ArduTester – Arduino Component Tester
,然後就畫一個PVC1602 LCD的PCB板洗出來玩,這個project用暴力測試的方式測出所有狀況,所以你的電子元件任意插在測試口都能測出來,最主要他還可以測電容跟二極體我認為這部分很讚!


Circuit:

 左上的SMD原件是兩個1206的104p陶瓷電容跟AMS1117 or LM 5V的線性穩壓器,JP3 左邊為pin 1,LCD使用 PVC160203P,JP2 左邊開始為 TX RX DTR VCC GND,JP1 就是Analog測點。





code要自己去原作者網站找
ardutester.ino v0.7f

參考:


ArduTester – Arduino Component Tester
AVR Transistortester

2014年1月6日 星期一

關於洗電路板的那些事(續.)

DIY Arduino - 從洗電路板開始!(1)
關於洗電路板的那些事

最近又再製作實驗電路,離上次又隔一段時間再弄電路的東西,這次人在台中換一套工具洗電路後發現幾個差異特別記錄一下。

曝光:原先是用飛利浦日光燈台燈(叉子形傳統燈管),現在用公司的IKEA工作燈(27W/1A)後,一開始燈泡是用LED燈泡,然後曝光之後發現完全沒效果,看了一下燈泡的包裝有說明不含紫外光,我想可能是這個差異所以無法讓光阻有反應,然後跑去換一顆23w的螺旋燈泡後就可以曝光,不過曝光時間比我飛利浦日光燈曝光時間還要短,2013/01/09生產的感光板曝光6分30秒就可以了(距離5-8cm),可能是功率比較強的關係吧?

蝕刻:最近在台中繼光的某家電料行買一罐已經是調配成液態的氯化鐵,老闆說還要在加水1:1稀釋才可用,結果回去照作發現怎麼蝕刻速度比以往用氯化鐵慢5倍以上?!後來我發現其實我以往當是直接電料行賣的液態氯化鐵直接去蝕刻所以比較濃稠速度較快,所以這個部份我想直接買電料行賣的液態氯化鐵就可以直接用不用再稀釋。

CPL:現在都習慣會噴CPL不過要注意的是,如果會一次多作幾塊板子放著備用,最好等線路都量測完再噴CPL,否則像我這次先噴上後絕緣會很難量測XD